Prolog DCG:从编程符号转换为逻辑符号

时间:2011-01-07 13:15:56

标签: prolog dcg

我正试图转换这种表示法:

A and (B or C) equ A and B or A and C)

标准逻辑表示法,例如and(A,B), or(A,B), neg(A)...

我认为这样做的好方法就是使用DCG(我提出这个问题因为我想练习DCG)。有什么想法为什么我的转换不起作用?到目前为止,我只是在得到一个变量时编写了析取和案例。我想要的答案应该是或(原子(X),原子(Y))。

convert1(atom(X)) --> [X], {var(X)},!.
convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).

test_convert1( F ) :-
   phrase( convert1( F ), [X, or, Y] ).

2 个答案:

答案 0 :(得分:1)

您的代码包含两个错误:

  1. 在第一个子句中,您不是从解析列表中读取X
  2. DCG中的削减应该在大括号之外。
  3. 工作版本是:

    convert1(atom(X)) --> [X], {var(X)}, !.
    convert1(or(X,Y)) --> convert1(X), [or], convert1(Y).   
    

答案 1 :(得分:1)

test_convert1/1中存在语法错误。它应该读

test_convert1(F) :-
    phrase(convert1(F), [X, or, Y]).