检查数字是否介于 2 个值之间

Check if a number is between 2 values

我是 prolog 的新手,我正在尝试编写一个程序来执行以下操作,如果数字介于 2 个值之间,我可以执行以下操作:

between(L, X, R) :- 
    X > L, X < R.

并在 (1, 3, 5) 之间进行工作,但我希望它能够在 (1, X, 5) 之间进行操作,并让序言 return 之间的所有值都在这种情况 X = 2,X = 3,X = 4,我明白为什么我的解决方案没有,因为它需要已经初始化,但我想不出解决这个问题的方法,这种类型的事情可以不在 prolog 中完成?,非常感谢

解决此问题的一种方法:

digit(0).
digit(1).
digit(2).
digit(3).
digit(4).
digit(5).
digit(6).
digit(7).
digit(8).
digit(9).

between(L, X, U) :- digit(L), digit(X), digit(U), L < X, X < U.

测试:

?- between(2, X, 5).
X = 3 ;
X = 4 ;
false.

?- between(2, 7, U).
U = 8 ;
U = 9.

或者,您可能想查看 Constraint logic programming

顺便说一下,Prolog 已经有一个 between/3:

?- between(1, 5, X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4 ;
X = 5.

尽管它“不合逻辑”:你不能运行它向后,正如上面的定义。

如果您不想预定义所有数字:让 prolog 创建一个包含可能条目的列表,并说明您的 X 必须是其中之一。要理解代码,您必须了解 prolog 中的列表,尤其是列表的头尾符号。

betweenList(L,R,[]):- 
    L>=R.
betweenList(L,R,[L|Rest]):- 
    L<R,
    LL is L+1,
    betweenList(LL,R,Rest).

between(L, X, R) :- 
    betweenList(L, R, [L| List]),
    member(X, List).

?- between(1,X,5).
X = 2 ;
X = 3 ;
X = 4 ;
false.

betweenList(L,R,List) 创建一个包含 LR 之间所有数字的列表,包括 L(作为头元素),不包括 R。所以如果你想生成一个没有L的List,直接调用betweenList(L, R, [L| List])是最简单的,所以List不会包含L。现在 X 只需成为 List 的成员即可。如果您不想使用内置谓词,member/2 谓词也可以轻松编写。