2010-12-10 91 views
4

我在愛因斯坦的謎語上實現了一個變體,我遇到了一些麻煩。列表中的唯一元素(Prolog)

當試圖計算解決方案,我試試這個:

solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5], 
%hint one goes here 
%hint two goes here 
%etc. 

然後我就可以讓鍵入的解決方案:解決(街)

然而,這出來作爲解決方案:

  1. 房子(花,食物,寵物,運動)
  2. 房子(花,食物,寵物,運動)
  3. 房子(X,食品,寵物,運動)
  4. 房子(花,食品,寵物,運動)
  5. 房子(X,花卉,寵物,運動)

,你可以看到有2次x,其餘是所有類型的食品,花卉,寵物和運動。 但是每種類型都是獨特的:如果一個人喜歡花X,其他人都不會喜歡X.

現在,我的解決方案給出2個x的原因很容易看出:我們給出了一定數量的提示,提示那裏只提到4朵花。所以Prolog不知道有另一朵花,只是使用x兩次,只是因爲它是可能的並且滿足所有其他提示。

我想說的是,在街上的所有類型的食物和鮮花等是獨特的,所以他應該留下一些空白時,他已經使用所有類型。 3看起來像:house(x , food, pet ,sport)和5看起來像:house(_, flower, pet, sport)

我也嘗試添加該給的提示:(讓我們說「仙人掌」是在暗示沒有提到的花之一) member(house(cactus,_,_,_), Street)

但是隨後我的程序並沒有結束......

一個提示可能看起來像這樣: is_neighbour(house(_,_,_,football),house(_,_,fish,_), Street), 用:is_neighbour(A,B,List)給予true當A和B是在List彼此相鄰。 提示可以被翻譯爲:熱愛足球的人在有魚的人旁邊生活。

如果需要提供更多信息,我願意詳細說明。 :)

回答

2

爲了表示沒有報道兩次花,並且爲了確保所有的花都被綁定,可以使用置換/ 2謂詞:所有花的列表應該是指定花的列表的置換。這讀起來像[未經測試]

flowers([], []). 
flowers([house(Flower,_,_,_)|Street], [Flower|Rest]) :- flowers(Street, Rest). 

-- ... 
    flowers(Street, Flowers), 
    permutation(Flowers, [kaktus, tulpe, nelke, rose, fingerhut]), 

編輯:10個花,用排列組合可能是太慢了。另一種方法是

flower(kaktus). 
flower(tulpe). 
flower(nelke). 
--... 

     flowers(Street,[F1,F2,F3,F4,F5,F6,F7,F8,F9,F10]), 
     flower(F1), flower(F2), F1\=F2, 
     flower(F3), F3\=F1, F3\=F2, 
     flower(F4), F4\=F1, F4\=F2, F4\=F3, 
     --... 
+0

聽起來像一個邏輯和可以理解的答案,但是我必須做錯了什麼..我添加了第二個列表中的所有花。我還把「花(街,花)」和排列交給「解決(街道)」。但現在似乎並沒有結束。 (通常它會在5分鐘內結束,但現在已經超過了15分鐘)。我把'permutation'放在哪裏有什麼關係? – Aerus 2010-12-10 22:19:32

+0

置換對於兩個參數都應該是對稱的,所以交換參數不應該有幫助。然而,將排列組合置於不同的位置應該非常有幫助,但是:您應該首先考慮那些限制解決方案空間的條件。將寫入的調用放入它中,讓它跟蹤它正在做什麼。 – 2010-12-10 22:27:59

+0

當我在它給出的提示末尾的排列周圍放置一個調用(寫()):置換([天竺葵,hyacint,** lelie **,大麗花,** lelie **],[仙人掌,天竺葵,hyacint,大麗花])。當我把它放在它給我的所有提示面前時:置換([_ 46,_53,_60,_67,_74],[仙人掌,lelie,天竺葵,hyacint,大麗花])。我不確定那是什麼意思。輸出仍然給我2 x的,但它現在結束了。我是否還需要爲其他類型添加排列,以便使這個單一排列有效? – Aerus 2010-12-10 22:53:18