SWI-Prolog创建/打印列表,递归等

时间:2014-03-18 19:35:30

标签: prolog

我试图教自己一些Prolog,但是现在我真的很难适应以前从未做过声明性编程的声明式风格。

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

老实说,我真的不知道从哪里开始,并且会感谢一些指导或一些示例代码,如上所述。

干杯!

2 个答案:

答案 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).