2016-02-29 67 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

明白了,谢谢:) –