【问题标题】:CLP in Prolog involving consecutive sums in a listProlog中的CLP涉及列表中的连续和
【发布时间】:2015-03-10 21:58:56
【问题描述】:

我的 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,但我并没有真正做到。

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

谢谢!

【问题讨论】:

    标签: prolog constraint-programming clpfd


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不确定这是否会有所帮助,我不明白您的工作流程......列表来自哪里?反正

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多