2016-02-29 18 views
1

訪問列表這是我的知識基礎的元素,(完全一樣):如何從序言知識庫

DataBase = [book('A',[author('B','C')],154,12,6,[publishedYear(1990)]), 
    book('Z',[author('Y','X')],155,1,62,[publishedYear(2009)])]. 

它是在同一個PL-文件與我們的其他謂詞。 我如何能夠使用它? 例如,如果我想做的事:

?- write(DataBase). 

它給出了一個錯誤,因爲它apparantly不能訪問變量。

編輯:我得到的錯誤是,它是一個單變量:

Singleton variables: [DB] 

和:

No permission to modify static_procedure `(=)/2' 
+0

請包括*逐字*您的pl文件的相關部分的副本,您的REPL交互和錯誤消息。 –

+0

這實際上是我的整個pl文件。該錯誤指出它是一個單身變量。例如,如果我想 - 寫(DB),它不能訪問它,即使我在使用此變量的知識庫本身中創建一個函數。 –

回答

1

(首先,你所謂的「功能」應該被稱爲「謂詞「)

如果我理解正確的話你認爲你做了,你寫

Var = Something. 

然後嘗試在謂詞中「訪問」該變量。您應該注意,邏輯編程中的「變量」與其他編程範例中的「變量」不同。

例如,在C中,變量是一個可以放置稍後可以更改的信息的地方。在邏輯編程中,變量是統一的,它是數學意義上的變量。

你還應該注意的是變量隱含普遍量化,所以當你寫

predicate(X,Y). 

你實際上是寫

forall X, forall Y, predicate(X,Y). 

這意味着之外的謂詞的,如果您再次使用字符串「X」來命名變量,它不再是同一個變量。含義如下

pred1(X). 
pred2(X). 

這些不是同一個變量。

,你能做些什麼來實現你彷彿在是大致目標,例如:

database([book('A',[author('B','C')],154,12,6,[publishedYear(1990)]), 
      book('Z',[author('Y','X')],155,1,62,[publishedYear(2009)])]). 

,如果你想在一個謂語pred使用它:

pred :- database(DB), do_this_with_it(DB). 

但我在理解你的意思時可能是錯誤的,所以請說出它是否不回答你的問題。

+0

明白了,謝謝:) –