例如,如果我想获得总和为10的所有可能的自然数对,我将如何获得这样做的序言? 如果我的代码是这样的:
sumsTo10(X,Y):-
Z is X+Y,
Z == 10.
然后是的,如果我问5和5总和是10我得到一个真实的答案,但我喜欢这样的事情:
?-sumsTo10(A,B).
[1,9]
[2,8]
....
答案 0 :(得分:3)
您可以使用 C onstraint L ogic P 编程库而不是 F inite D < / strong> omains(clpfd
):
:- use_module(library(clpfd)).
sumsTo10(X,Y):-
[X,Y] ins 1..10,
X + Y #= 10,
label([X,Y]).
然后生成:
?- sumsTo10(X,Y).
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7 ;
X = 4,
Y = 6 ;
X = Y, Y = 5 ;
X = 6,
Y = 4 ;
X = 7,
Y = 3 ;
X = 8,
Y = 2 ;
X = 9,
Y = 1.
第一行指定X
和Y
都在1..10
域中(包含10个,但无关紧要)。第二行是约束:它限制了X + Y
应该等于(#=
)到10
的事实。此仅添加约束:它不会将X
和Y
置于实际存在的值,而是从X
和Y
开始(部分)接地,并且不满足约束,它将失败。例如,如果您将X
设置为10
,则会导致Y
只能0
,但由于Y
位于1..10
区间内},这是不可能的,因此系统会失败。
最后,使用label([X,Y])
我们会将域中的值分配给X
和Y
,以便约束成立。
答案 1 :(得分:2)
您的Prolog可以提供between / 3。然后
?- between(1,10,X), between(1,10,Y), X+Y =:= 10.
X = 1,
Y = 9 ;
X = 2,
Y = 8 ;
X = 3,
Y = 7
...