Prolog“单变量”警告

Noo*_*ick 4 singleton prolog cryptarithmetic-puzzle

我是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.
Run Code Online (Sandbox Code Playgroud)

Pat*_* S. 5

由于此行而生成警告:

select(Y,WMAPD,WMAPDY),
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 将变量标记为单例。如果您以a开头的变量将_不会被检查,则为单例:select(Y, WMAPD,_WMAPDY)。另外,您可以使用特殊的单例变量_select(Y,WMAPD,_)。(此描述至少对于SWI Prolog是正确的,下划线的变量_WMAPDY可能适用于更多的方言)。

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

这是SWI-Prolog手册中的相关部分