查找添加到总和的整数组合

Dan*_*ner 0 prolog

我试图写一个程序,它的声明X + Y = Sum,并可以查询到的可能输出值XY给定一个Sum.X和Y中的每一个都可以是[0,Sum]中的整数.例如,因为X + Y = 10,我想得到(0,10),(1,9),......,(10,0).

怎么能在Prolog中完成?

小智 7

有很多方法可以解决这个问题,具体取决于您希望如何定义和约束您的问题."第一次尝试"的事情是:

0到10之间的哪两个数字总和为10?

您需要;在每个解决方案后键入:

?- between(0, 10, X), between(0, 10, Y), plus(X, Y, 10).
X = 0,
Y = 10 ;
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 = 10,
Y = 0 ;
false.
Run Code Online (Sandbox Code Playgroud)

您对问题的评论为您提供了很多有用的建议,可以从这里开始.本解决方案本身对理解或学习Prolog没有多大帮助.(我个人认为)CLPFD解决方案也不是:

?- use_module(library(clpfd)).
true.

?- [X,Y] ins 0..10, X + Y #= 10, label([X,Y]).
X = 0,
Y = 10 ; % etc
Run Code Online (Sandbox Code Playgroud)

您可以定义谓词,如:

foo(X + Y = Sum) :-
    between(0, Sum, X),
    between(0, Sum, Y),
    plus(X, Y, Sum).
Run Code Online (Sandbox Code Playgroud)

您可以尝试呼叫foo(X + Y = 10),或foo(X + 3 = 5),或foo(1 + Y =10),或foo(2 + 2 = 4)等等.更好的是,尝试使用CLPFD实现,看看如何使用该程序.

我能提出的最"直观"的Python解决方案:

>>> [(x,y) for x in range(0,11) for y in range(0,11) if x+y == 10]
[(0, 10), (1, 9), (2, 8), (3, 7), (4, 6), (5, 5), (6, 4), (7, 3), (8, 2), (9, 1), (10, 0)]
Run Code Online (Sandbox Code Playgroud)

作为练习,试着看看你将如何将它包装在一个函数中.

我敦促你尝试在C中解决这个问题,看看你需要花多少精力.