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

时间:2015-02-10 16:13:20

标签: prolog

我正在尝试编写一个接受语句X + Y = Sum的程序,并且可以查询为给定X输出YSum的可能值。 X和Y中的每一个都可以是[0,Sum]中的整数。例如,对于X + Y = 10,我想得到(0,10),(1,9),......,(10,0)。

如何在Prolog中完成?

1 个答案:

答案 0 :(得分: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.

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

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

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

您可以定义谓词:

foo(X + Y = Sum) :-
    between(0, Sum, X),
    between(0, Sum, Y),
    plus(X, Y, Sum).

您可以尝试拨打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)]

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

我敦促你尝试在C中解决这个问题,只是为了看看你需要付多少努力。