【问题标题】:Get one of many possible solutions in Prolog在 Prolog 中获取许多可能的解决方案之一
【发布时间】:2016-08-08 03:22:25
【问题描述】:

我正在尝试学习 Prolog。我看了这个脚本:

:- use_module(library(clpfd)).
puzzle([S,E,N,D] + [M,O,R,E] = [M,O,N,E,Y]) :-
   Vars = [S,E,N,D,M,O,R,Y],
   Vars ins 0..9,
   all_different(Vars),
   S*1000 + E*100 + N*10 + D + M*1000 + O*100 + R*10 + E #= M*10000 + O*1000 + N*100 + E*10 + Y,
   M #\= 0,
   S #\= 0.

来源:https://github.com/Anniepoo/prolog-examples/blob/master/sendmoremoney.pl

我像这样运行它并得到一些输出:

$ swipl -q -s sendmoremoney.pl
?- puzzle(X).
X = ([9, _G2009, _G2012, _G2015]+[1, 0, _G2024, _G2009]=[1, 0, _G2012, _G2009, _G2042]),
_G2009 in 4..7,
all_different([9, _G2009, _G2012, _G2015, 1, 0, _G2024, _G2042]),
91*_G2009+_G2015+10*_G2024#=90*_G2012+_G2042,
_G2012 in 5..8,
_G2015 in 2..8,
_G2024 in 2..8,
_G2042 in 2..8.

看起来这给了我每个字母的可能值范围。但是我怎样才能得到一个单一的解决方案,其中每个字母都分配给一个可能的值?似乎是一个非常基本的问题,但我无法弄清楚。

【问题讨论】:

    标签: prolog clpfd cryptarithmetic-puzzle


    【解决方案1】:

    好的,看起来这与其说是 Prolog 问题,不如说是 clpfd 问题。

    ?- puzzle(As + Bs = Cs), label(As).
    As = [9, 5, 6, 7],
    Bs = [1, 0, 8, 5],
    Cs = [1, 0, 6, 5, 2] ;
    false.
    

    在这里找到我的答案:http://www.swi-prolog.org/man/clpfd.html

    【讨论】:

    • s(X) 用于解决问题并链接到文档!您在 Internet 上找到的许多示例,包括您链接到的示例,都是从 CLP(FD) 文档中抄袭而来的,但缺乏正确的上下文并使用了不良做法。先看文档,再用官方资料查找其他文中的漏洞!
    • @mat,您似乎将 CLP(FD)clpfd 标签的理论概念和主题)和称为 clpfd(其中,令人困惑的是,有两个完全不同的,SICStus Prolog's 和 SWI/?-Prolog's)。发送更多钱的例子来自 Pascal Van Hentenryck 于 1989 年出版的 Constraint Satisfaction in Logic Programming 一书,此后在 CLP(FD) 上的每篇文章中都出现了细微的句法调整。如果它从任何地方被扯掉,那么从那里......
    • 是的,该示例也在其他地方使用。与其他更好的文档的链接也一样好。在这个具体案例中,请查看用于查看示例从何处复制而来的具体语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多