【问题标题】:Instantiation fault ECLiPSe CSP实例化故障 ECLiPSe CSP
【发布时间】:2016-02-25 18:58:19
【问题描述】:

我在 ECLiPSe 下的 CSP 存在问题。我希望为我的密码添加一个约束,要求 TWO 表示的数字可以被 2 整除。

[eclipse 11]: test(Xs).
instantiation fault in (_268{[1..4]}*100 + _200{[0..9]}*10 + _302{[0..9]}*1) mod 2#=0
Abort

感谢您的帮助。

我的代码:

/*
          T W O                                           
   +  T H R E E      
   +  T H R E E                                       
      ---------                                      
      E I G H T                                     
*/

:- lib(fd).

myCsp(Xs):-
    Xs=[W,I,G,H,T,R,O,E],
    Xs::0..9,
    [C1,C2,C3,C4]::0..2,
    T #> 0,E #> 0,
    O + E + E #= C1*10 + T,
    W + E + E + C1 #= C2*10 + H,
    T + R + R + C2 #= C3*10 + G,
    H + H + C3 #= C4*10 + I,
    T + T + C4 #= E,
    (T*100 + W*10 + O*1) mod 2 #= 0,
    alldifferent([W,I,G,H,T,R,O,E]).

test(Xs):-
    myCsp(Xs),
    labeling(Xs).

【问题讨论】:

  • 你为什么使用(is)/2?使用 CLP(FD) 约束 (#=)/2 来表达整数表达式的相等性!
  • 谢谢!我在 myCsp 中将 myModulo2(T,W,O), 替换为 T*100 + W*10 + O*1 #=/2,。但现在我有一个语法错误:#=/2 postfix/infix operator expected ??
  • 哦,来吧!您已经在程序的其他地方使用了(#=)/2(提示:它是您的 sn-p 中最常用的谓词)。剩下的两个地方也用它!
  • 我只是更改了我的代码,但仍然是同样的问题。我一定很傻:)

标签: prolog constraint-programming cryptarithmetic-puzzle eclipse-clp instantiation-error


【解决方案1】:

中的 mod/2 操作

(T*100 + W*10 + O*1) mod 2 #= 0

不支持。您可以将该行重写为

T*100 + W*10 + O*1  #=  2*_

表示左侧表达式等于匿名整数变量的两倍,因此是二的倍数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多