查找与原子相关的所有子句

时间:2010-04-26 22:56:49

标签: prolog

这可能是一个非常愚蠢的问题(我刚开始在几个小时前开始学习Prolog),但是有可能找到与原子相关的所有子句吗?例如,假设以下知识库:

cat(tom).
animal(X) :- cat(X).

,有没有办法获得关于汤姆的每一个可能的信息(或至少所有在基地明确陈述的事实)?我知道这样的查询是不可能的:

?- Pred(tom).

所以我认为我可以编写一条可以推断出正确信息的规则:

meta(Object, Predicate) :-
    Goal =.. [Predicate, Object],
    call(Goal).

这样我就可以编写诸如

之类的查询
?- meta(tom, Predicate).

但这不起作用,因为call的参数没有充分实例化。所以基本上我的问题是:这是可能的,还是Prolog没有设计提供这种信息?如果不可能,为什么?

1 个答案:

答案 0 :(得分:1)

您可以使用ISO谓词“current_predicate / 1”来查找可以调用的内容。 这是一个示例程序:

cat(tom).
animal(X) :- cat(X).

info(Arg,Info) :- current_predicate(PredName/1),
     Info =.. [PredName,Arg], call(Info).
all_info(Arg,L) :- findall(I,info(Arg,I),L).

您可以按如下方式使用该程序(我正在使用SICStus Prolog顺便说一句):

| ?- info(tom,X).
X = animal(tom) ? ;
X = cat(tom) ? ;
no
| ?- all_info(tom,X).
X = [animal(tom),cat(tom)] ? 
yes

通常,您可以按照以下方式使用

current_predicate

| ?- current_predicate(X).
X = info/2 ? ;
X = animal/1 ? ;
X = cat/1 ? ;
X = all_info/2 ? ;
no