Prolog “singleton variable” warning

前端 未结 2 2176
一个人的身影
一个人的身影 2021-01-06 11:27

I\'m new to Prolog and royally confused! I keep getting a \"singleton variable for [WMAPDY]\" warning. I read somewhere that sometimes that warning is useless. I also rea

相关标签:
2条回答
  • 2021-01-06 11:49

    The warning is generated because of this line:

    select(Y,WMAPD,WMAPDY),
    

    The program doesn't use the variable WMAPDY anywhere else, thus it is useless, and Prolog warns you about it, because it is likely a typo (it isn't in this case). To get rid of the warning you have some possibilities:

    1. Use member/2 instead of select/3, since you aren't interested in the resulting list: member(Y,WMAPD).

    2. Mark the variable as a singleton. If you start variables with a _ they wont be checked it they are singletons: select(Y, WMAPD,_WMAPDY). Alternatively, you could use the special singleton variable _: select(Y,WMAPD,_). (This description is at least true for SWI Prolog, the underscored variable _WMAPDY might work with more dialects).

    3. Use :- style_check(-singleton) in your file. This turns off all singleton variable warnings for the file, I'd rather not use that, because this warning is good for finding typos. (this desciption also is for SWI Prolog, SICStus Prolog may use the option single_var_warnings, for other systems, check your manual).

    Here is the relevant section in the SWI-Prolog manual

    0 讨论(0)
  • 2021-01-06 11:53

    Why not use clpfd?

    Building on my previous answer to a very related question, we query:

    ?- 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.
    
    0 讨论(0)
提交回复
热议问题