在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. 

第一行指定,这两个XY处于1..10域(即10以下,但是这并不重要)。第二行是限制:它限制了X + Y应该等于(#=)至10的事实。这将约束:它不会地面XY到这个实际持有的价值观,但是从目前XY被(部分)接地,并且约束不能满足,就会失败。如果您例如将X设置为10,则将导出Y只能为0,但由于Y位于区间1..10中,所以这是不可能的,因此系统将会失败。

最后,通过使用label([X,Y]),我们将在域中指定值为XY,以使约束成立。

您的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 
...