首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyswip中的prolog代码不工作

pyswip中的prolog代码不工作
EN

Stack Overflow用户
提问于 2019-04-26 10:51:21
回答 1查看 1.5K关注 0票数 1

我的问题与这个问题有关。

我希望下面的prolog代码嵌入到python程序中:

代码语言:javascript
复制
myEquation(A, B, C):- 
    var(A),number(B),number(C) -> A is B+C;
    var(B),number(A),number(C) -> B is A-C;
    var(C),number(A),number(B) -> C is A-B;
    A =:= B + C.

我安装了pyswip包并尝试了以下代码:

代码语言:javascript
复制
from pyswip import Prolog
prolog = Prolog()
prolog.assertz("myEquation(A, B, C):- var(A),number(B),number(C) -> A is B+C; var(B),number(A),number(C) -> B is A-C; var(C),number(A),number(B) -> C is A-B; A =:= B + C.")
prolog.assertz("myEquation(3,1,C).")

但这给了我一个错误:

代码语言:javascript
复制
ERROR: Syntax error: Operator priority clash
ERROR: assertz((myEquation(A, B, C):- var(A),number(B),number(C) -> A is B+C; var(B),number(A),number(C) -> B is A-C; var(C),number(A),number(B) -> C is A-B; A
ERROR: ** here **
ERROR:  =:= B + C.)). 
Traceback (most recent call last):
  File "prologpy.py", line 4, in <module>
    prolog.assertz("myEquation(A, B, C):- var(A),number(B),number(C) -> A is B+C; var(B),number(A),number(C) -> B is A-C; var(C),number(A),number(B) -> C is A-B; A =:= B + C.")
  File "/home/cardio/.local/lib/python3.5/site-packages/pyswip/prolog.py", line 140, in assertz
    next(cls.query(assertion.join(["assertz((", "))."]), catcherrors=catcherrors))
  File "/home/cardio/.local/lib/python3.5/site-packages/pyswip/prolog.py", line 127, in __call__
    "Returned: '", str(term), "'."]))
pyswip.prolog.PrologError: Caused by: 'assertz((myEquation(A, B, C):- var(A),number(B),number(C) -> A is B+C; var(B),number(A),number(C) -> B is A-C; var(C),number(A),number(B) -> C is A-B; A =:= B + C.)).'. Returned: 'error(syntax_error(operator_clash), string(b'assertz((myEquation(A, B, C):- var(A),number(B),number(C) -> A is B+C; var(B),number(A),number(C) -> B is A-C; var(C),number(A),number(B) -> C is A-B; A =:= B + C.)). ', 152))'.

我怎样才能解决这个问题。我还可以使用其他一些与prolog相关的python包,比如列在这里

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-26 11:34:45

谓词定义末尾的.太多了。把它处理掉。

例如,这是正确的:

代码语言:javascript
复制
?- assertz((foo :- bar)).

但这是不对的:

代码语言:javascript
复制
?- assertz((foo :- bar.)).

如果您阅读了示例提供吡咯烷酮,您应该注意到上面的本机Prolog代码转换为:

代码语言:javascript
复制
from pyswip import Prolog
prolog = Prolog()
prolog.assertz("(foo :- bar)")

而不是你写的

代码语言:javascript
复制
prolog.assertz("(foo :- bar.)")
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55866059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档