繁体   English   中英

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

[英]CLP in Prolog involving consecutive sums in a list

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

对于长度为5的列表,事实el_sum(Pos,N,Sum)指定从位置Pos(索引从1开始el_sum(Pos,N,Sum)的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但我并没有真正到达任何地方。

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

谢谢!

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

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

不确定这会有所帮助,我不明白你的工作流程......列表来自哪里? 无论如何

:- [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 ;
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM