【发布时间】:2016-05-16 21:02:28
【问题描述】:
是否有可以在 Sicstus Prolog 中使用的命令将内置谓词列表打印到控制台窗口?或者有类似行为的东西?
以下链接表明谓词 apropos 可用于根据关键字建议谓词,但这是针对 SWI-Prolog,而不是 Sicstus。
【问题讨论】:
标签: prolog
是否有可以在 Sicstus Prolog 中使用的命令将内置谓词列表打印到控制台窗口?或者有类似行为的东西?
以下链接表明谓词 apropos 可用于根据关键字建议谓词,但这是针对 SWI-Prolog,而不是 Sicstus。
【问题讨论】:
标签: prolog
在 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
【讨论】:
current_predicate/1 由 ISO 定义,并且似乎至少可用于 SISSTUS、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
【讨论】:
strict_iso 标志完全用词不当。严格 ISO 将是 13211-1:1995 5.1 e 意义上的严格模式。但 GNU 不提供这种模式。
current_predicate/1 在 GNU-Prolog 上的行为方式。我对此感到惊讶,并认为应该提及它。