【问题标题】:Simple Arithmetic Constraint on List ECLiPSe clp列表 ECLiPSe clp 上的简单算术约束
【发布时间】:2016-05-18 22:05:09
【问题描述】:

我想对列表的所有值做一个简单的约束, 我希望数组每一行的每个索引都具有以下(ic)约束:

500 #= 2^X1 + 2^X2 + 2^X3 + ... + 2^X9

我尝试执行下面的代码。数组是一个 9x9 矩阵,对于每一行,我都希望满足上述约束。但是,这似乎不起作用,程序没有找到任何满足约束的可能值。

model(Array) :- 
Array :: 1..9,
(for(I,1,9), param(Array) 
 do
      X1 is Array[I,1],
      X2 is Array(I,2],
      X3 is Array[I,3],
      X4 is Array[I,4],
      X5 is Array[I,5],
      X6 is Array[I,6],
      X7 is Array[I,7],
      X8 is Array[I,8],
      X9 is Array[I,9],
      500 #= 2^X1 + 2^X2 + 2^X3 + 2^X4 + 2^X5 + 2x^X6 + 2^X7 + 2^X8 + 2^X9

),
term_variables(Array,L),
labeling(L),
printBoard(Array).

【问题讨论】:

    标签: list matrix prolog clpfd eclipse-clp


    【解决方案1】:

    这似乎是涉及幂表达式的整数约束实现中的一个错误。由于您的变量无论如何都是整数,因此您可以将 #= 替换为 $= 并且它将起作用(# 约束应该对变量施加完整性,而 $ 约束不这样做) .

    顺便说一句,你可以这样缩短你的代码:

        ...,
        ( foreacharg(Row,Array) do
            ( foreacharg(X,Row), foreach(2^X,Powers) do true ),
            500 $= sum(Powers)
        ),
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多