【问题标题】:Using "Univ" / "=.." meta-predicate to return boolean result of a function?使用“Univ”/“=..”元谓词返回函数的布尔结果?
【发布时间】:2011-06-28 12:37:38
【问题描述】:

我正在尝试使用元谓词“=..”来返回一个值。

现在我在下面有两个示例,第一个有效 完美,但是我不知道如何使用第二个示例做类似的事情:

示例 1:

?- Expression=..[+,2,3], Value is Expression.
Expression = 2 + 3
Value = 5
yes

示例 2:

?- test(N):-N>=0.
Term asserted

?- Term=..[test,-5], Value is Term.

这会产生错误, 我希望 Value 为 yes 或 true 或 1, 这样我就可以在 IF 语句中使用它。

如何使用 "univ" "=.." 运算符来实现这一点?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您不能使用is/2 来获取谓词调用的布尔值。请改用call/1

    ?- Term =.. [test, -5], call(Term).
    false.
    ?- Term =.. [test, 5], call(Term).
    Term = test(5).
    

    或者只是:

    ?- call(test, 5).
    true.
    
    ?- call(test, -5).
    false.
    

    那么你的 if-then-else 就变成了:

    (Term =.. [test, -5], call(Term) ->
        % then-part
    ;
        % else-part
    )
    

    如果您出于其他原因想要具体化结果值,则适用通常的建议:

    (Term =.. [test, -5], call(Term) ->
        Value = true   % or 1
    ;
        Value = false  % or 0, or fail
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      相关资源
      最近更新 更多