我试图写一个程序,它的声明X + Y = Sum,并可以查询到的可能输出值X和Y给定一个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中解决这个问题,看看你需要花多少精力.