我是Prolog的新手并且非常困惑!我不断收到“WMAPDY”警告的“单例变量”。我在某个地方读到有时候这个警告毫无用处。我还读到由于警告,程序不会编译所有子句?
我正在尝试的程序是一个隐藏算术拼图,应该“解决”AM + PM = DAY。
如果有人可以帮助解决这个错误,那么单例变量警告总是很重要我会非常感激!!
斯科特
solve([A,M,P,D,Y]):-
select(A,[0,1,2,3,4,5,6,7,8,9],WA), % W means Without
not(A=0),
select(M,WA,WMA),
select(P,WMA,WMAP),
not(P=0),
select(D,WMAP,WMAPD),
not(D=0),
select(Y,WMAPD,WMAPDY),
DAY is 100*D+10*A+Y,
AM is 10*A+M,
PM is 10*P+M,
DAY is AM+PM.
答案 0 :(得分:4)
由于以下行而生成警告:
select(Y,WMAPD,WMAPDY),
该程序在其他任何地方都没有使用变量WMAPDY
,因此它没用,而Prolog会对此发出警告,因为它可能是一个错字(在这种情况下它不是) 。要摆脱警告你有一些可能性:
使用member/2
代替select/3
,因为您对结果列表不感兴趣:member(Y,WMAPD)
。
将变量标记为单例。如果您使用_
启动变量,则不会检查它们是单例:select(Y, WMAPD,_WMAPDY)
。或者,您可以使用特殊的单例变量_
:select(Y,WMAPD,_)
。 (对于SWI Prolog,此描述至少是正确的,强调变量_WMAPDY
可能适用于更多的方言)。
在您的文件中使用:- style_check(-singleton)
。这会关闭文件的所有单例变量警告,我宁愿不使用它,因为此警告适用于查找拼写错误。 (这个解释也适用于SWI Prolog,SICStus Prolog可以使用选项single_var_warnings
,对于其他系统,请查看您的手册)。
答案 1 :(得分:2)
为什么不使用clpfd?
以my previous answer为基础构建 very related question,我们查询:
?- solve_n_dump([A,M] + [P,M] #= [D,A,Y]).
Eq = ([2,5]+[9,5]#=[1,2,0]), Zs = [2,5,9,1,0].
Eq = ([2,7]+[9,7]#=[1,2,4]), Zs = [2,7,9,1,4].
Eq = ([2,8]+[9,8]#=[1,2,6]), Zs = [2,8,9,1,6].
Eq = ([3,5]+[9,5]#=[1,3,0]), Zs = [3,5,9,1,0].
Eq = ([3,6]+[9,6]#=[1,3,2]), Zs = [3,6,9,1,2].
Eq = ([3,7]+[9,7]#=[1,3,4]), Zs = [3,7,9,1,4].
Eq = ([3,8]+[9,8]#=[1,3,6]), Zs = [3,8,9,1,6].
Eq = ([4,5]+[9,5]#=[1,4,0]), Zs = [4,5,9,1,0].
Eq = ([4,6]+[9,6]#=[1,4,2]), Zs = [4,6,9,1,2].
Eq = ([4,8]+[9,8]#=[1,4,6]), Zs = [4,8,9,1,6].
Eq = ([5,6]+[9,6]#=[1,5,2]), Zs = [5,6,9,1,2].
Eq = ([5,7]+[9,7]#=[1,5,4]), Zs = [5,7,9,1,4].
Eq = ([5,8]+[9,8]#=[1,5,6]), Zs = [5,8,9,1,6].
Eq = ([6,5]+[9,5]#=[1,6,0]), Zs = [6,5,9,1,0].
Eq = ([6,7]+[9,7]#=[1,6,4]), Zs = [6,7,9,1,4].
Eq = ([7,5]+[9,5]#=[1,7,0]), Zs = [7,5,9,1,0].
Eq = ([7,6]+[9,6]#=[1,7,2]), Zs = [7,6,9,1,2].
Eq = ([7,8]+[9,8]#=[1,7,6]), Zs = [7,8,9,1,6].
Eq = ([8,5]+[9,5]#=[1,8,0]), Zs = [8,5,9,1,0].
Eq = ([8,6]+[9,6]#=[1,8,2]), Zs = [8,6,9,1,2].
Eq = ([8,7]+[9,7]#=[1,8,4]), Zs = [8,7,9,1,4].
true.