使用SWI-Prolog,语法,单例错误

时间:2013-05-07 10:50:40

标签: prolog zebra-puzzle

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

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

:- 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]).

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

1 个答案:

答案 0 :(得分:2)

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

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非常受欢迎的分配问题。在这里搜索档案 - 过去几天里有几个 - 你应该找到一些灵感。