【问题标题】:Some implicit constraint一些隐式约束
【发布时间】:2017-12-11 01:55:58
【问题描述】:

当我执行这段代码时(如下所示),它总是设置隐式约束。

正如您在下面看到的,它总是说D1 = D2,但没有这样的明确约束,也没有任何模式匹配会强制这样做。

或者换句话说,D1 和 D2 之间存在一些引用,这样每当 D1 被初始化时,D2 就会自动初始化。我看不出这是怎么回事。谁能解释一下,我试过用调试器解决它,但没有帮助。

这是一个“杰拉德 + 唐纳德 = 罗伯特”的谜题,最初三个列表包含这些变量。

如果有人想测试,我在下面添加代码:

sum(N1,N2,N):-
    sum1(N1,N2,N,0,0,[0,1,2,3,4,5,6,7,8,9],_).

sum1([],[],[],0,0,Digits,Digits).    
sum1([D1|N1],[D2|N2],[D|N],C1,C,Digs1,Digs2):-
    sum1(N1,N2,N,C1,C2,Digs1,Digs2),
    digitSum(D1,D2,C2,D,C,Digs2,Digs).

digitSum(D1,D2,C1,D,C,Digs1,Digs):-
    del(D1,Digs1,Digs2),
    del(D2,Digs2,Digs3),
    del(D,Digs3,Digs),
    S is D1 + D2 + C1,
    D is S mod 10,
    C is D div 10.

del(A,L,L):-
    nonvar(A),!.
del(A,[A|L],L).
del(A,[B|L],[B|L1]):-
    del(A,L,L1).

查询:

?- sum( [D,O,N,A,L,D], [G,E,R,A,L,D], [R,O,B,E,R,T] ).

【问题讨论】:

  • 你写了 D 是 S mod 10,C 是 D div 10。。 D 是介于 0 和 9 之间的值,因此 C 始终为 0。我认为您想要 C 是 S div 10。要解决您的问题,您应该查看库 clpfd。
  • 使用 clpfd 可以轻松解决这个问题,看看this。

标签: prolog cryptarithmetic-puzzle


【解决方案1】:

当它显示D1 = D2 时,您应该看到D1 和D2 在列表中具有相同的变量,并且List 是一个仿函数,并且一个变量在整个仿函数中可见。

你应该看到,当递归结束时,你有来自 GERALD 和 DONALD 的 D's(last element),因为这个 D 在整个仿函数中可见,D1 和 D2 都指到同一个变量。

【讨论】:

  • 这意味着它不会找到所有的解决方案?
  • 你说的是真的!因为会自动对D1 和D2 的值进行约束,这意味着如果两个变量相同,那么它们的值也必须相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多