Prolog:是否有命令列出所有内置谓词?

时间:2016-05-16 21:02:28

标签: prolog

是否有一个可以在Sicstus Prolog中使用的命令,它可以在控制台窗口中打印内置谓词列表?或者有类似行为的东西?

以下链接表明谓词apropos可用于根据关键字建议预测,但这适用于SWI-Prolog,而不是Sicstus。

http://www.swi-prolog.org/pldoc/doc_for?object=section%282%2C%27F.1%27%2Cswi%28%27%2Fdoc%2FManual%2Fpredsummary.html%27%29%29

2 个答案:

答案 0 :(得分:3)

在SICStus Prolog中,您可以使用predicate_property/2内置谓词列出内置谓词。例如:

| ?- predicate_property(P, built_in).
P = get_char(_A) ? ;
P = execution_state(_A) ? ;
...

如果您想要包含所有内置谓词的列表,请尝试:

| ?- findall(P, predicate_property(P, built_in), L).
L = [get_char(_A),execution_state(_B),nospy _C,print_coverage(_D),print_profile(_E),debugging,disable_breakpoints(_F),current_breakpoint(_G,_H,_I,_J,_K),execution_state(_L,_M),spy(...)|...] ? 
yes

答案 1 :(得分:1)

current_predicate/1由ISO定义,似乎至少可用于SICSTUS,SWI-Prolog和GNU-Prolog。

other answer中指出的

predicate_property/2至少在这三个Prolog实现中也是可用的。

请注意,对于GNU-Prolog,如果要使用current_predicate/1枚举内置函数,则必须首先关闭“strict_iso”:

| ?- current_predicate(P).

no
| ?- assertz(aaa).

yes
| ?- current_predicate(P).

P = aaa/0 ? ;

(1 ms) no
| ?- set_prolog_flag(strict_iso, off).

yes
| ?- current_predicate(P).            

P = max_list/2 ? ;

P = at_end_of_stream/0 ? ;

P = at_end_of_stream/1 ? % and so on