如何从prolog知识库访问列表



这是我知识库中的元素,(完全像这样):

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

它与我们的其他谓词位于同一个 pl 文件中。我如何能够访问它?例如,如果我想做:

  ?- write(DataBase).

它给出了一个错误,因为它显然无法访问变量。

编辑:我得到的错误是它是一个单例变量:

   Singleton variables: [DB] 

和:

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

(首先,你所说的"函数"应该叫"谓词")

如果我正确理解你认为你做了什么,你写了

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).

但我可能理解你的意思是错误的,所以如果它没有回答你的问题,请说出来。