Prolog:如何在添加之前检查数据库中是否存在项目?

时间:2011-03-26 20:04:34

标签: prolog

我从一个空白数据库开始。我需要添加一些数据库条目,例如:

person(John,male)
person(Veronica,female)
person(Jessica,female)

我正在添加这样的条目:

add_person(N,G):-asserta(person(N,G)).

Howerver,我不想两次添加同一个人,所以我需要在添加之前进行检查。

我试图这样做:

add_person(N,G):- \+ person(N,G),asserta(person(N,G)).

问题是我无法查询数据库,如果我的数据库为空,请说person(John,male)。所以person(N,G)因存在错误而失败,我根本无法添加。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我不确定您使用的是哪种Prolog版本,但是您可以通过将此行放在代码的顶部来声明某些谓词是动态的:

:- dynamic person/2.

SWI-Prolog documentation中描述了这一点。

答案 1 :(得分:2)

你写John的方式是变量而不是原子。你应该只使用小写的原子(johnveronica等)。我只是尝试了你的代码,它工作正常:

person(john, male).

add_person(N,G):-
    \+ person(N,G),
    asserta(person(N,G)).

再次添加john失败并返回false