突出的一個潛在問題是名單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 = yang
和C2 = 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
的前兩個元素。第三個參數17
與L
的第三個元素中的術語T_age+3
不匹配。請記住:Prolog不會將其作爲方程式T_age+3 = 17
解決。它只是將17看作原子整數,並將T_age+3
看作是帶有兩個參數的術語,並發現它們不匹配。所以這個member
調用失敗,整個謂詞失敗。
'L'是一個看起來像'person(...)'('person/3')的術語列表。一些'成員'檢查正在''L'中尋找類似'h(...)'的術語,這些術語在'L'中不存在,所以這些將會失敗。另外,你的一些''成員'檢查有3個參數,(* eg *,'member(h,(_,_,15),L)'),並且會產生一個錯誤。 – lurker
@lurker對不起,大的複製粘貼錯字。更正了,但仍然沒有結果。 –