在prolog中计算类似的事实

时间:2012-01-26 09:12:00

标签: prolog

我想返回true,如果事实(A)在Prolog数据库中只声明一次,否则返回false。例如,如果我们有:

class('Person').
class('Person').
isUniqueClass(A) :- %%% This part I don't know how to do

我查询isUniqueClass('Person').我想要返回false。但是,如果我们有:

class('Person').
isUniqueClass('Person') :- %%% Again same thing goes here

我查询isUniqueClass('Person').我希望它返回true。

2 个答案:

答案 0 :(得分:3)

使用模式匹配的@twinterer答案的较短版本:

isUniqueClass(C) :-
 findall(C, class(C), [_]).

修改:改进

不是“调用”谓词,而是应该使用适当的内置函数来完成元编程,即

isUniqueClass(C) :-
 findall(C, clause(class(C), true), [_]).

在这种情况下它没有任何区别,因为事实不能产生副作用......

答案 1 :(得分:1)

您可以使用findall/3检索所有实例的列表,然后使用length/2检查列表的长度。如果列表的长度为1,则事实是唯一的。