我在愛因斯坦的謎語上實現了一個變體,我遇到了一些麻煩。列表中的唯一元素(Prolog)
當試圖計算解決方案,我試試這個:
solve(Street) :- Street = [_House1,_House2,_House3,_House4,_House5],
%hint one goes here
%hint two goes here
%etc.
然後我就可以讓鍵入的解決方案:解決(街)
然而,這出來作爲解決方案:
- 房子(花,食物,寵物,運動)
- 房子(花,食物,寵物,運動)
- 房子(X,食品,寵物,運動)
- 房子(花,食品,寵物,運動)
- 房子(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
彼此相鄰。 提示可以被翻譯爲:熱愛足球的人在有魚的人旁邊生活。
如果需要提供更多信息,我願意詳細說明。 :)
聽起來像一個邏輯和可以理解的答案,但是我必須做錯了什麼..我添加了第二個列表中的所有花。我還把「花(街,花)」和排列交給「解決(街道)」。但現在似乎並沒有結束。 (通常它會在5分鐘內結束,但現在已經超過了15分鐘)。我把'permutation'放在哪裏有什麼關係? – Aerus 2010-12-10 22:19:32
置換對於兩個參數都應該是對稱的,所以交換參數不應該有幫助。然而,將排列組合置於不同的位置應該非常有幫助,但是:您應該首先考慮那些限制解決方案空間的條件。將寫入的調用放入它中,讓它跟蹤它正在做什麼。 – 2010-12-10 22:27:59
當我在它給出的提示末尾的排列周圍放置一個調用(寫()):置換([天竺葵,hyacint,** lelie **,大麗花,** lelie **],[仙人掌,天竺葵,hyacint,大麗花])。當我把它放在它給我的所有提示面前時:置換([_ 46,_53,_60,_67,_74],[仙人掌,lelie,天竺葵,hyacint,大麗花])。我不確定那是什麼意思。輸出仍然給我2 x的,但它現在結束了。我是否還需要爲其他類型添加排列,以便使這個單一排列有效? – Aerus 2010-12-10 22:53:18