Prolog 序言:在序言中将逻辑运算符定义为其他运算符的占位符

Prolog 序言:在序言中将逻辑运算符定义为其他运算符的占位符,prolog,operator-keyword,placeholder,Prolog,Operator Keyword,Placeholder,我的目标是用prolog编写一个小的prove助手。我的第一步是定义逻辑连接词,如下所示: :-op(800, fx, -). :-op(801, xfy, &). :-op(802, xfy, v). :-op(803, xfy, ->). :-op(804, xfy, <->). :-op(800, xfy, #). 但以下定义: proposition(X) :- atomicproposition(X). proposition(X # Y) :-

我的目标是用prolog编写一个小的prove助手。我的第一步是定义逻辑连接词,如下所示:

:-op(800, fx, -).

:-op(801, xfy, &).

:-op(802, xfy, v).

:-op(803, xfy, ->).

:-op(804, xfy, <->).

:-op(800, xfy, #).
但以下定义:

proposition(X) :- atomicproposition(X).

proposition(X # Y) :- proposition(X), proposition(Y).

proposition(- X) :- proposition(X). 

给予


我做错了什么?

你不能这样定义语法同义词。当你定义这样的东西时

X # Y :-
    X & Y.
您定义语义:“要执行
X#Y
,请执行
X&Y
”。但您尚未定义任何“执行
X&Y
”的方法:

然后,与:

proposition(X) :-
    atomicproposition(X).
proposition(Binary) :-
    binary_x_y(Binary, X, Y),
    proposition(X),
    proposition(Y).
proposition(- X) :-
    proposition(X).

atomicproposition(a).
我们得到:

?- proposition(a v -a).
true ;
false.

?- proposition(P).
P = a ;
P =  (a v a) ;
P =  (a v a v a) ;
P =  (a v a v a v a) ;
P =  (a v a v a v a v a) ;
P =  (a v a v a v a v a v a) .  % unfair enumeration
还有其他一些表达相同关系的方法,只需少键入一点,例如:

binary_x_y(Binary, X, Y) :-
    Binary =.. [Op, X, Y],  % Binary is of the form Op(X, Y)
    member(Op, [v, &, ->, <->]).
binary_x_y(binary,x,y):-
二进制=。。[Op,X,Y],%二进制的形式为Op(X,Y)
成员(作品[v,&,,,])。

如果问题解决了,请接受答案,将问题标记为已解决。谢谢
?- X # Y.
ERROR: Undefined procedure: (&)/2
ERROR: In:
ERROR:    [9] _2406&_2408
ERROR:    [8] _2432#_2434 at /home/isabelle/op.pl:13
ERROR:    [7] <user>
binary_x_y(X  v  Y, X, Y).
binary_x_y(X  &  Y, X, Y).
binary_x_y(X  -> Y, X, Y).
binary_x_y(X <-> Y, X, Y).
proposition(X) :-
    atomicproposition(X).
proposition(Binary) :-
    binary_x_y(Binary, X, Y),
    proposition(X),
    proposition(Y).
proposition(- X) :-
    proposition(X).

atomicproposition(a).
?- proposition(a v -a).
true ;
false.

?- proposition(P).
P = a ;
P =  (a v a) ;
P =  (a v a v a) ;
P =  (a v a v a v a) ;
P =  (a v a v a v a v a) ;
P =  (a v a v a v a v a v a) .  % unfair enumeration
binary_x_y(Binary, X, Y) :-
    Binary =.. [Op, X, Y],  % Binary is of the form Op(X, Y)
    member(Op, [v, &, ->, <->]).