我使用SWI-Prolog。 這是不可能的?在數據庫中使用變量
:- dynamic question/1.
question([do, you, know, what, a, F1, is, ?]).
question([does, F1, have, a, F2, ?]).
.....
?- question([do, you, know, what, a, son, is, ?]), writeln(F1).
F1 = son.
我使用SWI-Prolog。 這是不可能的?在數據庫中使用變量
:- dynamic question/1.
question([do, you, know, what, a, F1, is, ?]).
question([does, F1, have, a, F2, ?]).
.....
?- question([do, you, know, what, a, son, is, ?]), writeln(F1).
F1 = son.
在Prolog,當你有一個謂語從句或事實(或規則),只有一次被認爲是單發生任何變化。這意味着Prolog沒有將變量與其他任何內容相關聯的信息,並且不能在該子句中對其進行實例化。
像下面這樣一個事實有一個單變量,F1
:
question([do, you, know, what, a, F1, is, ?]).
有沒有在這一點它涉及到F1
。因此,查詢如:
?- question([do, you, know, what, a, son, is, ?]).
將匹配並因此成功。但是,查詢中沒有變量與事實中的任何內容相結合,因此您沒有其他結果。同樣,F1
和F2
在以下事實單變量:
question([does, F1, have, a, F2, ?]).
一個可以糾正這種情況的辦法是變量隔離在一個單獨的參數,使他們不再是單身,和前導將統一它們的時候執行查詢。例如:
question([do, you, know, what, a, F1, is, ?], [F1]).
question([does, F1, have, a, F2, ?], [F1, F2]).
現在你可以使用你自己的變量,將與那些在這些事實被統一做一個查詢:
?- question([do, you, know, what, a, son, is, ?], [X]).
X = son
當Prolog的接收查詢,這是您第事實相符,和第一個參數[do, you, know, what, a, son, is, ?]
與[do, you, know, what, a, F1, is, ?]
統一,而[X]
將與[F1]
統一。由於第一次統一結果爲F1 = son
,因此您將有[X] = [son]
等,X = son
。
同理:
?- question([does, fred, have, a, son, ?], [X, Y]).
X = fred
Y = son
然後查詢等問題([你,你知道,什麼,一個兒子,是?],L)。會產生,L = [兒子]
請注意,'F1'的範圍僅限於它出現的子句。因此查詢中的「F1」與事實中的「F1」不同。你需要一些額外的上下文信息來管理這個。對於初學者,只要認爲這是不可能的。 – false
總的來說,你想要達到什麼或者做什麼?你可以做一些事情,例如問題([你,知道,是什麼,F1,是,?],[F1])和問題([確實,F1,有,F2,?] ,[F1,F2])。',從而在同一個子句中捕獲變量名稱。然後,一個查詢就像'問題'([你,知道,什麼,一個,一個兒子,是?],L)。'會產生'L = [兒子]'。 – lurker
@ lurker你應該考慮寫你的評論作爲回答 – 2015-09-07 11:16:46