Prolog notBetween函数

时间:2013-05-16 23:20:52

标签: prolog

我需要一些Prolog的帮助。 所以我之间有这个函数来评估一个元素是否在其他两个之间。 我现在需要的是一个函数,它评估成员是否不在其他两个之间,即使它与其中一个成员相同。 我试过了:

notBetween(X,Y,Z,List):-right(X,Y,List),right(Z,Y,List). // right means Z is right to Y and left the same for the left

notBetween(X,Y,Z,List):-left(X,Y,List),left(Z,Y,List).

notBetween(X,Y,Z,List):-Y is Z;Y is X.

我从Prolog开始,所以也许它甚至没有接近工作,所以我很感激一些帮助!

1 个答案:

答案 0 :(得分:1)

当它出现否定时,必须更谨慎地处理Prolog行为,因为否定被“嵌入”在证明引擎中(参见SLD resolution以了解更多关于抽象Prolog的内容)。在你的情况下,你列出了3个替代品,然后如果是真的,Prolog将尝试下一个。这与你需要的相反。

有一个运算符(\ +)/ 2,读取不是。这个名称是“有目的地”选择的,不同于它,要记住我们与我们在演讲中使用的 not 有点不同。

但在这种情况下它会起作用:

notBeetwen(X,Y,Z,List) :- \+ between(X,Y,Z,List).

当然,对于Prolog程序员来说,直接使用\ +会更清楚,而不是“隐藏”它的谓词 - 并且需要检查。

使用基本列表内置的/ 4之间的可能定义

between(X,Y,Z,List) :- append(_, [X,Y,Z|_], List) ; append(_, [Z,Y,X|_], List).

编辑:一个更简单,更具建设性的定义(最小?)可能是:

notBetween(X,Y,Z, List) :-
  nth1(A, List, X),
  nth1(B, List, Y),
  nth1(C, List, Z),
  ( B < A, B < C ; B > A, B > C ), !.

编辑 :( ==)/ 2适用于列表,没有副作用(它不是实例变量)。实施例

1 ?- [1,2,3] == [1,2,3].
true.

2 ?- [1,2,X] == [1,2,X].
true.

3 ?- [1,2,Y] == [1,2,X].
false.