Prolog notBetween 函数

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

最佳答案

当涉及到否定时,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/

相关文章:

prolog - SICStus Prolog JIT 编译器

prolog - 如何在Prolog中保留变量名?

prolog - 我自己父亲的侄子在序言中

prolog - 如何在归纳逻辑编程中生成反例?

prolog - 在沃伦的抽象机器中,如果参数之一是寄存器,绑定(bind)如何工作?

prolog - 序言: DCG Syntax Error

list - gnu Prolog powerset 修改

lisp - 使用 Lisp 或 PROLOG 从列表中删除元素的外观

prolog - 前言。在查询中,如何在结果中不需要的变量上加条件?

prolog - Prolog 中的 DNA 匹配