【问题标题】:Using SWI-Prolog, syntax,singleton errors使用 SWI-Prolog,语法,单例错误
【发布时间】:2013-05-07 10:50:39
【问题描述】:

我需要使用 SWI-prolog 来解决家庭作业的逻辑难题,但即使我有编程背景,我也觉得语法和含义非常麻烦。我面临的问题是关于单例变量的错误,并且拼图返回 false。

这是我到目前为止所做的:

:- use_module(library(clpfd)).

sends(K,priscilla,C),
    C#\=rose.
sends(carol,L,rose).
sends(dick,L,sun).

sends(K,L,landscape).
sends(bob,rhonda,C).
sends(edna,quincy,C).

sends(K,simon,deer).
sends(K,tina,C).

solve :-
    sends(
        [alice,bob,carol,dick,edna],
        [priscilla,rhonda,quincy,simon,tina],
        [rose,heart,sun,landscape,deer]).

这就是问题,向正确方向轻推或帮助我更好地理解语言的答案将不胜感激!

【问题讨论】:

  • 有趣的是,您发现语法很麻烦。有打火机的例子吗?

标签: prolog zebra-puzzle


【解决方案1】:

只要你有一个单一的使用变量,你就会得到一个单一的错误。这似乎是你唯一使用变量的地方,所以我希望你能得到很多。您上面的代码相当于:

sends(_,priscilla,C),
    C#\=rose.
sends(carol,_,rose).
sends(dick,_,sun).

sends(_,_,landscape).
sends(bob,rhonda,_).
sends(edna,quincy,_).

sends(_,simon,deer).
sends(_,tina,_).

如果将单例变量替换为 _ 看起来很奇怪或有问题,那么这是一个很好的指标,表明您缺少逻辑。请注意,您所写的sends/3 的参数似乎完全是原子的,这使得这个调用特别奇怪:

sends(
    [alice,bob,carol,dick,edna],
    [priscilla,rhonda,quincy,simon,tina],
    [rose,heart,sun,landscape,deer]).

没有理由期望 Prolog 神奇地将 sends/3 与列表的用法转换为其他原子调用。我不知道你期望在这里发生什么。

这类谜题是 Prolog 非常流行的分配问题。在这里搜索档案——最近几天有几个——你应该会找到一些灵感。

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多