gpt4 book ai didi

Prolog notBetween 函数

转载 作者:行者123 更新时间:2023-12-03 03:58:16 25 4
gpt4 key购买 nike

我需要一些关于 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 开始,所以也许它还没有接近工作,所以我希望得到一些帮助!

最佳答案

当涉及到否定时,Prolog 行为必须更加小心地处理,因为否定是“嵌入”在证明引擎中的(请参阅 SLD resolution 以了解更多关于抽象 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.

关于Prolog notBetween 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16599063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com