我试图教自己一些Prolog,但是现在我真的很难适应以前从未做过声明性编程的声明式风格。
我试图让我的程序得出两个正整数,A& B,其中A + B =< 50和B> A.显然有很多解决方案(例如A = 5& B = 12或A = 15& B = 17),我希望我的程序能够打印所有不同的解决方案。
老实说,我真的不知道从哪里开始,并且会感谢一些指导或一些示例代码,如上所述。
干杯!
答案 0 :(得分:1)
使用约束逻辑编程看起来是一个很好的问题:
:- use_module(library(clpfd)).
model(A, B) :-
A #> 0, B #> 0,
A + B #=< 50,
B #> A.
(我假设你只想要正整数解,否则会有无数个)。看看模型代码如何直接反映问题陈述。
获得模型后,您可以使用它来查找所有解决方案:
?- findall(_, (model(A, B), label([A, B]), writeln([A, B])), _).
[1,2]
[1,3]
[1,4]
[1,5]
[1,6]
... skipped many lines ...
[24,25]
[24,26]
true.
没有约束编程的更传统的Prolog解决方案(具有相同的结果):
model2(A, B) :-
between(1, 50, A),
between(1, 50, B),
A + B =< 50,
B > A.
?- findall(_, (model2(A, B), writeln([A, B])), _).
答案 1 :(得分:0)
你可以这样做:
combos(A,B) :-
between(1,50,A) ,
between(1,50,B) ,
S is A+B ,
S =< 50
.
在回溯中,这将连续找到所有解决方案。
使用findall/3
将结果收集到列表中:
findall(A+B,combos(A,B),X).