序言非常新,無論如何
我有一個包含姓名、路號、地址的資料庫。
habite('Name', Num, 'Address').
我想創建一個規則voisins(X,Y),該規則回傳地址與 Y 相同的人的姓名,但 Num 要么是 Num,要么是它的相鄰 (Num 1) 和 (Num-1)。
我嘗試執行以下操作
voisins(X,Y) :-
habite(X,Num,Address),
ANum is Num 1,
habite(Y,ANum,Address);
BNum is Num-1,
habite(Y,BNum,Address).
也試過了
voisins(X,Y) :-
habite(X,Num,Address),
ANum is Num 1,
BNum is Num-1,
habite(Y,ANum,Address),
habite(Y,ANum,Address).
他們都不起作用。我覺得這有一個非常簡單的答案,但我對 Prolog 很陌生,所以我真的不知道。感謝任何幫助。
uj5u.com熱心網友回復:
您可以嘗試以下操作:
voisins(X,Y) :-
habite(Y,YNum,Address),
habite(X,XNum,Address),
(XNum =:= YNum ; XNum =:= YNum - 1 ; XNum =:= YNum 1).
第一個目標找到名字為 Y 的人的路號和地址,然后分別統一到變數 YNum 和 Address。第二個目標然后將變數 X 與與 Y 具有相同地址的人的姓名統一起來,同時另外將 XNum 與此人的道路編號統一起來。最后,將 XNum 與 YNum 進行比較,以查看它是否滿足您在開頭提到的約束。這通過析取表示:(;)/2。
基本上,Prolog 將嘗試查看 XNum 是否與 YNum 具有相同的(算術)值。如果此檢查成功,則謂詞 voisins(X,Y) 對于統一到 X 的名稱為真,因此它會回復您并通過回溯繼續搜索其他答案。另一方面,如果它失敗了,它將轉到下一個并檢查那個是否成立,等等。
同樣,您也可以將上述謂詞寫為:
voisins(X,Y) :-
habite(Y,YNum,Address),
habite(X,YNum,Address).
voisins(X,Y) :-
habite(Y,YNum,Address),
habite(X,XNum,Address),
XNum =:= YNum - 1.
voisins(X,Y) :-
habite(Y,YNum,Address),
habite(X,XNum,Address),
XNum =:= YNum 1.
在這里,析取已“展開”為 的三個獨立定義voisins,其中每個定義進行三個比較之一。它的作業方式與之前的解決方案類似,只是現在 Prolog 會選擇下一個可用的謂詞作為替代,以防比較失敗。另外,請注意如何XNum =:= YNum更緊湊地表達檢查,因為值 YNum 用于habite(X,YNum,Address)進一步限制 X 的可能值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/383191.html
上一篇:R:直接在服務器上創建表
