2016-04-28 135 views
0

所以我在Prolog中有一個簡單的愛因斯坦/斑馬謎題變體。年齡約束查找

enter image description here

,我想出了這個可能的解決方案:

b_setval(T_age, Var). 
friends(L) :- 
    L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
    : 
    : 
    member(person(_,yang,T_age+3),L), 
    member(person(_,_,18),L). 

但我查詢friends(L). - false.的規定只返回false。 我在做什麼錯?

+1

'L'是一個看起來像'person(...)'('person/3')的術語列表。一些'成員'檢查正在''L'中尋找類似'h(...)'的術語,這些術語在'L'中不存在,所以這些將會失敗。另外,你的一些''成員'檢查有3個參數,(* eg *,'member(h,(_,_,15),L)'),並且會產生一個錯誤。 – lurker

+0

@lurker對不起,大的複製粘貼錯字。更正了,但仍然沒有結果。 –

回答

1

以下@luker的答案後,你可以檢查你的答案

friends(L) :- 
    % 1 
    L = [person(ada, _, Ta), person(ama, _, _), person(ana, _, _)], 
    % 2 
    member(person(_,_,15), L), 
    member(person(_,_,17), L), 
    member(person(_,_,18), L), 
    % 3 
    member(person(_, chang, _), L), 
    % 4 
    member(person(_, yang, Ty), L), Ty is Ta + 3, 
    % 5 
    member(person(_, thatcher, 17), L). 

有趣的是,這將產生2分的結果,這是怪異這種問題。

+0

我的變量命名有一些錯誤,但最後我明白了! –

1

突出的一個潛在問題是名單L中的T_age+3條款。在Prolog中,這不會在線算術評估。它只是一個術語,'+'(T_age,3)。所以匹配這個列表的這個成員的唯一元素將是一個看起來像person(X, Y, <something>+3)的術語。目前還不清楚這是否是你的意圖。

你可以做一個trace看到變量是如何被實例化,每個member電話,但讓我們嘗試手動做這說明目的:

L = [person(A1, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)], 
member(person(ada, _,T_age),L), 
... 

member調用總能成功,因爲Prolog的可以匹配到person(A1, B1, T_age)在清單中統一A1 = ada。該列表L現在看起來像:

[person(ada, B1, T_age), person(A2, B2, C2), person(A3, B3, T_age+3)] 

移動到下一個member電話:

member(person(ama, _, _),L), 
... 

第一構件這所無法比擬的,但可以通過統一A2 = ama匹配第二。 L現在是:

[person(ada, B1, T_age), person(ama, B2, C2), person(A3, B3, T_age+3)] 

然後,你必須:

member(person(ana, _, _),L), 

這不能在第一或第二元件匹配,但可以通過統一A3 = ana匹配第三。 L現在是:

[person(ada, B1, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

member電話是:

member(person(_,chang, _),L), 

可以通過統一B1 = chang再次匹配第一個成員,所以L變成:

[person(ada, chang, T_age), person(ama, B2, C2), person(ana, B3, T_age+3)] 

然後

member(person(_,yang,T_age+3),L), 

這將通過統一,B2 = yangC2 = T_age+3匹配列表的第二個元素。L就變成了:

[person(ada, chang, T_age), person(ama, yang, T_age+3), person(ana, B3, T_age+3)] 

然後

member(person(_,thatcher,17),L), 

這是你有一些麻煩。由於第二個參數,它不能匹配L的前兩個元素。第三個參數17L的第三個元素中的術語T_age+3不匹配。請記住:Prolog不會將其作爲方程式T_age+3 = 17解決。它只是將17看作原子整數,並將T_age+3看作是帶有兩個參數的術語,並發現它們不匹配。所以這個member調用失敗,整個謂詞失敗。

+0

我的意圖是匹配3歲以上的年齡比其他人年齡!我的概念現在很清楚!你能否提出一種可能的解決辦法,以便我可以得到可能的人的輸出?非常感謝! –

+0

我發佈了基於你的建議的另一個版本,這也不起作用:( –

+0

@jeet你是說它只是失敗?按照我的回答中的建議,或者做一個「跟蹤」或像我一樣穿過它。我認爲我回答了你原來的問題,所以如果你發現我對這個問題的回答是可以接受的,也許你可以接受它:)在你的更新中,表達式'member(person(_,yang,Y),Y是X + 3 ,L).'因爲您將3個參數傳遞給'member/2',這是一個錯誤。也,。在這種情況下,'Y是X + 3'將被解釋爲一個術語('是(+(X,3),L)')。正如我在我的回答中所提到的,除非使用特定的算術評估,否則Prolog不會評估表達式。 – lurker