【问题标题】:Prolog: How to check if a predicate exists?Prolog:如何检查谓词是否存在?
【发布时间】:2014-06-14 18:04:25
【问题描述】:

如何检查 Prolog 程序中是否存在谓词?那将是exists/1,例如:

?- exists(some_predicate).
false.

?- assert(some_predicate).
true.

?- exists(some_predicate).
true.

【问题讨论】:

    标签: prolog


    【解决方案1】:

    你可以使用current_predicate/1current_predicate/2predicate_property/2(最后你可能需要functor/3):

    ?- current_predicate(a/1).
    false.
    
    ?- functor(A,a,1),predicate_property(A,visible).
    false.
    
    ?- functor(A,a,1),current_predicate(_,A).
    false.
    
    ?- assert(a(42)).
    true.
    
    ?- current_predicate(a/1).
    true.
    
    ?- functor(A,a,1),predicate_property(A,visible).
    A = a(_G136).
    
    ?- functor(A,a,1),current_predicate(_,A).
    A = a(_G122).
    

    current_predicate/2predicate_property/2(可见)如果谓词可以自动加载,则成功,而 currrent_predicate/1 失败

    【讨论】:

      【解决方案2】:

      “老式方式”,但在 ISO 中被接受,是clause/2。您可能会在重用/浏览一些较旧的示例时遇到它。

      示例:

      ?- [user].
      |: app([], Y, Y).
      |: app([X|Xs], Y, [X|Zs]) :- app(Xs, Y, Zs).
      |: % user://1 compiled 0,15 sec, 17 clauses
      true.
      
      ?- clause(app(X,Y,Z),Body).
      X = [],
      Y = Z,
      Body = true ;
      X = [_G338|_G339],
      Z = [_G338|_G342],
      Body = app(_G339, Y, _G342).
      

      【讨论】:

      • 这在 ISO 中仅适用于具有公共属性的谓词!默认情况下,它不适用于静态代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多