2014-03-18 133 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