2014-03-18 94 views
0

我想教自己一些Prolog,但是现在我真的在努力适应从未做过声明式编程的声明式风格。SWI-Prolog创建/打印列表,递归等

我试图让我的计划,拿出两个正整数,A & B,其中A + B = < 50和B> A.显然有很多的解决方案(例如,A = 5 & B = 12或A = 15 & B = 17),我希望我的程序能够打印所有不同的解决方案。

我真的不知道从哪里开始,并会欣赏一些指导或如上所述如何做某些事情的示例代码。

干杯!

回答

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). 
+0

谢谢!这很有效 – Elviii

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])), _). 
+0

感谢您的回应! – Elviii