3

我需要一些关于 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 开始,所以也许它甚至离工作还很近,所以我会很感激一些帮助!

4

1 回答 1

1

当涉及到否定时,必须更加小心地处理 Prolog 行为,因为否定被“嵌入”在证明引擎中(请参阅SLD 决议以了解更多关于抽象 Prolog 的信息)。在您的情况下,您列出了 3 个备选方案,如果其中一个正确,Prolog 将尝试下一个。这与您需要的相反。

有一个操作符 (\+)/2,读。这个名字是“故意”选择的,与没有不同,要记住它与我们在说话时那么容易使用的名字有点不同。

但在这种情况下,它将起到作用:

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

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

between/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.
于 2013-05-17T05:03:21.633 回答