Prolog错误:谓词受保护

时间:2013-09-01 18:07:20

标签: prolog predicate win-prolog

我是prolog的新手,如果两个火车站在同一条线上,我正在尝试写一个返回“Yes”的谓词。

line(1,[a,b,c,d,e]);
line(2,[b,g,f,e,i,h]);
line(3,[l,m,g,n,f,o,p,q,i,j]);


same_line(X,Y):-
    line(_,L),
    member(X,L),
    member(Y,L).

实施例: ? - same_line(n,j)。 是

但是,编译时我在WIN-PROLOG中遇到此错误:错误67:谓词保护

我做错了什么?

1 个答案:

答案 0 :(得分:0)

回答,以便问题从未答复的列表中删除 问题:是(;)/ 2是一个问题。如果你真的只是 想要是或否,您也可以尝试使用memberchk / 2而不是member / 2。 代码如下:

line(1,[a,b,c,d,e]).
line(2,[b,g,f,e,i,h]).
line(3,[l,m,g,n,f,o,p,q,i,j]).

same_linechk(X,Y):-
    line(_,L),
    memberchk(X,L),
    memberchk(Y,L).

按预期工作:

?- same_linechk(n,j).
true.

谓词memberchk / 2是SWI-Prolog的一部分而不是 在第一次找到匹配成员后回溯。 它基本上是一个内置切割的menber / 2,因此 平均速度是平均值的两倍。

再见