在Prolog程序中查找所有自然数解决方案
问题描述:
例如,如果我想获得总和为10的所有可能的自然数对,我将如何得到prolog来做到这一点? 如果我的代码是这样的:在Prolog程序中查找所有自然数解决方案
sumsTo10(X,Y):-
Z is X+Y,
Z == 10.
然后是的,如果我问,如果5,5和10,我得到一个真正的答案,但我想是这样的:
?-sumsTo10(A,B).
[1,9]
[2,8]
....
答
可以使用ç onstraint 大号逻辑P在AGC库在˚F inite d 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
,以使约束成立。
答
您的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
...