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