【发布时间】:2020-08-24 05:06:06
【问题描述】:
我正在寻找 Prolog 中的一种方法、模式或内置功能,我可以使用它来返回为什么一组谓词失败,至少就数据库中的谓词而言担心。当用户在系统中提出查询时,我试图说的不仅仅是“那是错误的”。
例如,假设我有两个谓词。如果某物是蓝色的,blue/1 为真,如果某物是狗,dog/1 为真:
blue(X) :- ...
dog(X) :- ...
如果我向 Prolog 提出以下查询并且 foo 是一只狗,但不是蓝色,Prolog 通常只会返回“false”:
? blue(foo), dog(foo)
false.
我想要找出为什么谓词的连接不正确,即使它是带外调用,例如:
? getReasonForFailure(X)
X = not(blue(foo))
如果谓词必须以某种方式编写,我可以,我只是在寻找人们使用过的任何方法。
到目前为止,我已经取得了一些成功的方法是通过以程式化的方式编写谓词并使用一些辅助谓词来找出事后的原因。例如:
blue(X) :-
recordFailureReason(not(blue(X))),
isBlue(X).
然后实现 recordFailureReason/1 以便它始终记住发生在堆栈最深处的“原因”。如果查询失败,则无论发生最深的失败都被记录为失败的“最佳”原因。这种启发式方法在许多情况下都非常有效,但确实需要仔细构建谓词才能正常工作。
有什么想法吗?如果有为这种分析设计的谓词逻辑系统,我愿意在 Prolog 之外寻找。
【问题讨论】:
-
只为所有谓词添加默认子句,当谓词失败时应该达到默认谓词并报告谓词失败。完成此操作后,您的下一个问题将是
How do I get the path Prolog took to get to the failed predicate?。如果您继续沿着这条滑坡走下去,您会发现自己正在创建一个调试器,然后您会希望它美观且图形化。因此,使用 SWI-Prolog 可以省去麻烦并使用gtrace。