我想教自己一些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