Prolog错误:谓词受保护

Prolog错误:谓词受保护,prolog,predicate,win-prolog,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). 例如: ?相同的_线(n,j)。 对 但是,我在编译时在WIN-PROLOG中遇到了这个错误:!错误67:谓词受保护

我不熟悉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).
例如: ?相同的_线(n,j)。 对

但是,我在编译时在WIN-PROLOG中遇到了这个错误:!错误67:谓词受保护


我做错了什么?

只是回答,这样问题就从未回答的问题列表中消失了 问题:(;)/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.
谓词成员CHK/2是SWI Prolog的一部分,而不是 在第一次找到匹配的成员后回溯。 它本质上是一个带有内置切口的menber/2,因此在 平均速度是原来的两倍


再见

为什么在断言的
行的末尾有分号(
)?它们应该是句号(
),谢谢。就像我说的,我对prolog是新手。在一行末尾使用(;)是一种“反射”。这解决了问题吗?是的,解决了。我觉得自己很愚蠢,不用担心。我在Prolog、Ruby、Python和C/C++之间切换,这种情况也发生在我身上。。。