1

即使目标失败,有什么方法可以在 Prolog 中获得变量的绑定。我有一个谓词,我在其中绑定了一个具有某个值的变量,之后我明确地没有达到目标,但是当我运行查询时,它只会导致失败,而没有为变量提供任何出价。相似的东西:

a(X) :-
 X = 'something',
 fail.
4

2 回答 2

3

@Will Ness 是正确的 (+1),assert可用于捕获变量的绑定,如图所示。

但是,如果您严格需要检索谓词中的变量绑定,a并且您知道哪些部分可能会失败(并且您不关心它们),那么您可以使用 cut ( !) 的组合并true允许a继续进行。例如,考虑:

a(X) :-
    goalA(X), % a goal for which we definitely want a binding
    (goalB, ! ; true). % an 'optional' goal which may fail

goalA('something').
goalB :- fail.

执行这个给出a('something'),即使goalB失败了。请注意,这不是在 Prolog 中编程的常用方法,但是如果您确切地知道自己在做什么...

于 2013-04-28T10:22:03.323 回答
2

是的,这就是 Prolog 中应该发生的方式。fail表示拒绝到目前为止所做的绑定,因为它说这些绑定是无效的,不满足目标。

但是您可以保存一些将在回溯时撤消的绑定,例如assertapredicate

a(X) :-
 X = 'something',
 asserta(saved_x(X)),
 fail.

然后,如果您saved_x(Z)事后查询,您将恢复该值。当然,这是 Prolog 的额外逻辑部分,即逻辑编程范式之外。

于 2013-04-28T10:09:38.273 回答