【问题标题】:Prolog error: Predicate ProtectedProlog 错误:谓词受保护
【发布时间】:2013-09-01 18:07:19
【问题描述】:

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

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:谓词受保护

我做错了什么?

【问题讨论】:

  • 为什么line 断言的末尾有分号 (;)?它们应该是句点 (.)。
  • 谢谢。就像我说的,我是 prolog 的新手。这是一种在行尾使用 (;) 的“反射”。
  • 这样能解决问题吗?
  • 是的,确实如此。对此我感到很愚蠢。
  • 不用担心。我在 Prolog、Ruby、Python 和 C/C++ 之间切换,这也发生在我身上……

标签: prolog predicate win-prolog


【解决方案1】:

只是回答,所以问题会从未回答的列表中消失 问题:是的 (;)/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,因此在 平均速度是平均速度的两倍。

再见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多