2015-09-05 65 views
1

我使用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. 
+4

請注意,'F1'的範圍僅限於它出現的子句。因此查詢中的「F1」與事實中的「F1」不同。你需要一些額外的上下文信息來管理這個。對於初學者,只要認爲這是不可能的。 – false

+3

總的來說,你想要達到什麼或者做什麼?你可以做一些事情,例如問題([你,知道,是什麼,F1,是,?],[F1])和問題([確實,F1,有,F2,?] ,[F1,F2])。',從而在同一個子句中捕獲變量名稱。然後,一個查詢就像'問題'([你,知道,什麼,一個,一個兒子,是?],L)。'會產生'L = [兒子]'。 – lurker

+0

@ lurker你應該考慮寫你的評論作爲回答 – 2015-09-07 11:16:46

回答

1

在Prolog,當你有一個謂語從句或事實(或規則),只有一次被認爲是發生任何變化。這意味着Prolog沒有將變量與其他任何內容相關聯的信息,並且不能在該子句中對其進行實例化。

像下面這樣一個事實有一個單變量,F1

question([do, you, know, what, a, F1, is, ?]). 

有沒有在這一點它涉及到F1。因此,查詢如:

?- question([do, you, know, what, a, son, is, ?]). 

將匹配並因此成功。但是,查詢中沒有變量與事實中的任何內容相結合,因此您沒有其他結果。同樣,F1F2在以下事實單變量:

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 = [兒子]