2012-05-28 76 views
1

我是Prolog的初學者,遇到了一個我根本無法理解的問題。這裏是問題:序言:如何對圖進行編碼

當我在早上起牀時需要打扮,我遵循 下圖所示的規則。 這意味着在把我的右鞋穿上之前,我需要穿上我的褲子和我的右襪子,然後再穿上我的右襪子。我沒有在圖上顯示箭頭 - 如果節點a和b之間存在一條線,我假設 它面向a到b,如果b在圖中高於a。因此,我的數字可以被視爲一個關係的有向圖,之前。

http://dropcanvas.com/4j5z7/2

創建表示哈斯圖事實的知識基礎。在/ 2 之前使用一個謂詞(這個符號在Prolog文獻中被接受,並且意味着之前的謂詞有兩個參數)。

+1

請告訴我們你寫的至今。記住 - stackoverflow不是一項家庭作業服務。 –

+0

@AshleyMills我認爲這個問題並不屬於「解決我的家庭作業」類別;聽起來更像是「這個練習需要什麼」 –

+0

@ user1422167我的不好 - 它就像我在學習Prolog時所學的大學作業一樣! –

回答

3

一個編碼是:

before(ItemA, ListOfAllItemsYouHaveToWearBeforeItemA).

before(ListOfAllItemsYouHaveToWearBeforeItemA,ItemA).

(我認爲這首先是更好)

所以對於右腳的鞋,你會寫

before(right_shoe,[right_sock,pants]). 

另一種可能的編碼方式它可能是before(ItemA,ItemYouHaveToWearBeforeItemA).(或反向)。 在這種情況下,你會寫是這樣的:

before(right_shoe,right_sock). 
before(right_show,pants). 

編碼的選擇取決於你想/有什麼需要做的下一個(或任何其他運動的要求)。例如 例如,如果您想要獲得一件物品的要求,第一種編碼會更好,而如果您不僅要求在物品之前應該佩戴什麼,而且還要在物品之後佩戴什麼,則第二種編碼會更好。

如果我剛剛代表圖我將與第二編碼去,因爲這兩個參數具有相同的類型(圖項目),它是圖的更直接表示

+0

非常感謝。 – user1422167

+0

@ user1422167歡迎您:) –

+0

我認爲您的第二個變體更好,參數交換順序:通常對於二元關係,應將「r(A,B)」理解爲「A r B」,即'before ,毛衣)'讀爲「襯衫(穿上)在毛衣之前」。根據http://en.wikipedia.org/wiki/Hasse_diagram,不應使用列表。另外,根據同一WP文章,如果在圖紙中出現「前(褲子,夾克)」鏈接,則不應將**包含在該表示中。示例圖的選擇在這方面是不幸的。它已經是一個有效的Hasse圖,但練習可能是在檢查時*構建它。 –