我想教自己一些Prolog,但是现在我真的在努力适应从未做过声明式编程的声明式风格。SWI-Prolog创建/打印列表,递归等
我试图让我的计划,拿出两个正整数,A & B,其中A + B = < 50和B> A.显然有很多的解决方案(例如,A = 5 & B = 12或A = 15 & B = 17),我希望我的程序能够打印所有不同的解决方案。
我真的不知道从哪里开始,并会欣赏一些指导或如上所述如何做某些事情的示例代码。
干杯!
我想教自己一些Prolog,但是现在我真的在努力适应从未做过声明式编程的声明式风格。SWI-Prolog创建/打印列表,递归等
我试图让我的计划,拿出两个正整数,A & B,其中A + B = < 50和B> A.显然有很多的解决方案(例如,A = 5 & B = 12或A = 15 & B = 17),我希望我的程序能够打印所有不同的解决方案。
我真的不知道从哪里开始,并会欣赏一些指导或如上所述如何做某些事情的示例代码。
干杯!
你可以做这样的事情:
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).
看起来像一个很好的问题,使用约束逻辑规划:
:- 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])), _).
感谢您的回应! – Elviii
谢谢!这很有效 – Elviii