2013-05-07 60 views
-1

我需要使用SWI-prolog来解决作业的逻辑难题,但是即使使用我的编程背景,我发现语法和含义非常繁琐。我面临的问题是关于单身变量的错误,而谜题返回false。使用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

+3

有趣的是,你会发现语法繁琐。任何一个较轻的例子? – CapelliC 2013-05-07 13:02:54

回答

2

在任何地方你会得到一个singleton错误,你有一个单一的使用变量。这似乎是你唯一使用的变量,所以我希望你能得到很多。

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

没有理由期望序言本使用sends/3神奇地转换使用列表到一些其他的用原子调用。我不知道你期望在这里发生什么。

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