向DCG Prolog询问答案

向DCG Prolog询问答案,prolog,swi-prolog,dcg,Prolog,Swi Prolog,Dcg,我有一个用prolog编写的DCG,它试图将字符串转换成简单的命题逻辑 目前的规则是: +表示或,*表示和,-表示不 g(or(X,Y)) --> f(X), "+", g(Y). g(X) --> f(X). f(and(X,Y)) --> e(X), "*", f(Y). f(X) --> e(X). e(not(X)) --> "-", d(X). e(X) --> d(X).

我有一个用prolog编写的DCG,它试图将字符串转换成简单的命题逻辑

目前的规则是: +表示或,*表示和,-表示不

g(or(X,Y)) -->
    f(X),
    "+",
    g(Y).
g(X) -->
    f(X).

f(and(X,Y)) -->
   e(X),
   "*",
   f(Y).
f(X) -->
   e(X).

e(not(X)) -->
   "-",
   d(X).
e(X) -->
   d(X).

d(X)-->
   "(",
   g(X),
   ")".    
d(a)-->
   "a".
d(b)-->
   "b".
但是,我遇到了
本地跟踪之外的问题
错误


这段代码应该是正确的,但是我如何要求Prolog给出
和(不是(a,b)),或(b,不是(a))
作为
-(a+b)*(b+-a)

的答案呢?你的语法看起来不错,但你忘了处理/跳过空格

?- phrase(g(X), `-(a+b)*(b+-a)`).
X = and(not(or(a, b)), or(b, not(a))) ;
false.

(注意:我已经手动删除了所有空格,并使用SWI Prolog扩展用于代码文本列表。)

?-短语(g(X),
-(a+b)*(b+-a)
)。错误:语法错误:运算符预期错误:短语(g(X),
-(a+b)*(错误:**此处**错误:b+-a)
)。您使用了哪些扩展名?我是指输入周围的反勾号-您可以在我的帖子中看到它们。。。否则,请使用
?-atom_代码('-(a+b)*(b+-a)”,Cs),短语(g(X),Cs)。
@JoséValente:请注意,使用
`
是特定于SWI的。所有其他系统要么拒绝这一点,要么对此做出不同的解释。因此:
:-设置prolog\u标志(双引号,代码)。
并将
用于
短语/2
。这在任何地方都有效。您可以使用语法生成所有句子,如:
?-长度(L,N),短语(g(X),L)。