在Prolog程序中查找所有自然数解决方案

时间:2017-10-17 20:13:45

标签: math prolog

例如,如果我想获得总和为10的所有可能的自然数对,我将如何获得这样做的序言? 如果我的代码是这样的:

sumsTo10(X,Y):-
   Z is X+Y,
   Z == 10.

然后是的,如果我问5和5总和是10我得到一个真实的答案,但我喜欢这样的事情:

?-sumsTo10(A,B).
[1,9]
[2,8]
....

2 个答案:

答案 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.

第一行指定XY都在1..10域中(包含10个,但无关紧要)。第二行是约束:它限制了X + Y应该等于(#=)到10的事实。此添加约束:它不会将XY置于实际存在的值,而是从XY开始(部分)接地,并且不满足约束,它将失败。例如,如果您将X设置为10,则会导致Y只能0,但由于Y位于1..10区间内},这是不可能的,因此系统会失败。

最后,使用label([X,Y])我们会将域中的值分配给XY,以便约束成立。

答案 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
...