【问题标题】:Prolog "singleton variable" warningProlog“单变量”警告
【发布时间】:2014-12-09 00:54:40
【问题描述】:

我是 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.

【问题讨论】:

  • 没用的不是警告,而是变量!
  • 所以我应该取出变量?
  • 具体来说,在您的表达式select(Y,WMAPD,WMAPDY) 中,WMAPDY 变量不会在其他任何地方使用。换句话说,您的select 提供了您不使用的结果。如果您不需要 select,则将其删除。如果您需要 select 的结果,请使用它。

标签: prolog singleton cryptarithmetic-puzzle


【解决方案1】:

由于这一行而生成警告:

select(Y,WMAPD,WMAPDY),

该程序不会在其他任何地方使用变量WMAPDY,因此它是无用的,Prolog 会警告您,因为它可能是一个错字(在这种情况下不是)。要摆脱警告,您有一些可能性:

  1. 使用member/2 而不是select/3,因为您对结果列表不感兴趣:member(Y,WMAPD)

  2. 将变量标记为单例。如果您以 _ 开头变量,则不会对其进行检查,因为它们是单例:select(Y, WMAPD,_WMAPDY)。或者,您可以使用特殊的单例变量_select(Y,WMAPD,_)。 (这个描述至少对 SWI Prolog 是正确的,下划线变量_WMAPDY 可能适用于更多方言。

  3. 在您的文件中使用:- style_check(-singleton)。这会关闭文件的所有单例变量警告,我宁愿不使用它,因为这个警告有利于查找错别字。 (此描述也适用于 SWI Prolog,SICStus Prolog 可以使用选项single_var_warnings,对于其他系统,请查看您的手册)。

Here is the relevant section in the SWI-Prolog manual

【讨论】:

  • Patrick 你太棒了,再次感谢您回答我的问题!你是序言大师!
  • 下划线开头的变量(当然,不包括匿名变量 _)在 Prolog 系统上不会报告为单例取决于。在某些情况下,它还取决于下划线后面的字母是小写还是大写(例如,SWI-Prolog 将 a(_x,_Y,a). 子句 _x 报告为单例)。
  • 我会补充一点,我从 OP 的上一个问题中知道,他使用 SWI。
【解决方案2】:

为什么不使用

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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2017-04-11
    相关资源
    最近更新 更多