2013-05-07 62 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非常流行的分配問題。在這裏搜索檔案 - 在過去幾天裏有幾個 - 你應該找到一些靈感。