如何从prolog知识库访问列表

时间:2016-02-29 09:00:48

标签: 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'

1 个答案:

答案 0 :(得分: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).

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