【问题标题】:Prolog: Is there a command to list all built in predicates?Prolog:是否有列出所有内置谓词的命令?
【发布时间】:2016-05-16 21:02:28
【问题描述】:

是否有可以在 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

【问题讨论】:

    标签: prolog


    【解决方案1】:

    在 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
    

    【讨论】:

      【解决方案2】:

      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 不提供这种模式。
      • @false 用词与否,这就是current_predicate/1 在 GNU-Prolog 上的行为方式。我对此感到惊讶,并认为应该提及它。
      • 你没有回答问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多