我正在尝试编写一个接受语句X + Y = Sum
的程序,并且可以查询为给定X
输出Y
和Sum
的可能值。 X和Y中的每一个都可以是[0,Sum
]中的整数。例如,对于X + Y = 10
,我想得到(0,10),(1,9),......,(10,0)。
如何在Prolog中完成?
答案 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中解决这个问题,只是为了看看你需要付多少努力。