我想返回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。
答案 0 :(得分:3)
使用模式匹配的@twinterer答案的较短版本:
isUniqueClass(C) :-
findall(C, class(C), [_]).
修改:改进
不是“调用”谓词,而是应该使用适当的内置函数来完成元编程,即
isUniqueClass(C) :-
findall(C, clause(class(C), true), [_]).
在这种情况下它没有任何区别,因为事实不能产生副作用......
答案 1 :(得分:1)
您可以使用findall/3
检索所有实例的列表,然后使用length/2
检查列表的长度。如果列表的长度为1,则事实是唯一的。