这可能是一个非常愚蠢的问题(我刚开始在几个小时前开始学习Prolog),但是有可能找到与原子相关的所有子句吗?例如,假设以下知识库:
cat(tom).
animal(X) :- cat(X).
,有没有办法获得关于汤姆的每一个可能的信息(或至少所有在基地明确陈述的事实)?我知道这样的查询是不可能的:
?- Pred(tom).
所以我认为我可以编写一条可以推断出正确信息的规则:
meta(Object, Predicate) :-
Goal =.. [Predicate, Object],
call(Goal).
这样我就可以编写诸如
之类的查询?- meta(tom, Predicate).
但这不起作用,因为call
的参数没有充分实例化。所以基本上我的问题是:这是可能的,还是Prolog没有设计提供这种信息?如果不可能,为什么?
答案 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