Prolog中的CLP涉及列表中的连续总和

时间:2015-03-10 21:58:56

标签: prolog constraint-programming clpfd

我的CLP问题示例(这是使用clpfd库的较大问题的一小部分):

对于长度为5的列表,事实el_sum(Pos,N,Sum)指定从位置Pos(索引从1开始)的N个连续元素的总和等于Sum。所以,如果我们有

el_sum(1,3,4).
el_sum(2,2,3).
el_sum(4,2,5).

然后[1,2,1,4,1]适用于此示例,因为1 + 2 + 1 = 4,2 + 1 = 3,4 + 1 = 5.

我正在努力学习如何开始使用el_sum's来查找带有输入列表[X1,X2,X3,X4,X5]的解决方案。我认为我应该使用findall,但我并没有真正到达任何地方。

(我的实际问题比这要大得多,所以我正在寻找一个不仅适用于三个事实和一个小清单的解决方案。)

谢谢!

2 个答案:

答案 0 :(得分:3)

你在这里混合了单调的约束世界和一些非单调量化。不要试图太紧密地混合它们。相反,首先将这些事实转化为一系列术语。

el_sums(Gs) :-
   G = el_sum(_,_,_),
   findall(G, G, Gs).

然后,只有这样,从约束部分开始,现在将保持单调。所以:

?- el_sums(Gs), length(L5,5), maplist(l5_(L5), Gs).

l5_(L5, el_sum(P, N, S)) :-
   length([_|Pre], P),
   length(Cs, N),
   phrase((seq(Pre),seq(Cs),seq(_)), L5),
   list_sum(Cs,S).

seq([]) --> [].
seq([E|Es]) --> [E], seq(Es).

答案 1 :(得分:0)

不确定这会有所帮助,我不了解您的工作流程...从列表的位置来看?反正

:- [library(clpfd)].

el_sum(Pos,N,Sum) :-
    length(L, 5),
    L ins 0..100,
    el_sum(Pos,N,Sum,L),
    label(L), writeln(L).

el_sum(P,N,Sum,L) :-
    N #> 0,
    M #= N-1,
    Q #= P+1,
    el_sum(Q,M,Sum1,L),
    element(N,L,T),
    Sum #= Sum1 + T.
el_sum(_P,0,0,_L).

产量

?- el_sum(1,2,3).
[0,3,0,0,0]
true ;
[0,3,0,0,1]
true ;
...