即使目标失败,有什么方法可以在 Prolog 中获得变量的绑定。我有一个谓词,我在其中绑定了一个具有某个值的变量,之后我明确地没有达到目标,但是当我运行查询时,它只会导致失败,而没有为变量提供任何出价。相似的东西:
a(X) :-
X = 'something',
fail.
即使目标失败,有什么方法可以在 Prolog 中获得变量的绑定。我有一个谓词,我在其中绑定了一个具有某个值的变量,之后我明确地没有达到目标,但是当我运行查询时,它只会导致失败,而没有为变量提供任何出价。相似的东西:
a(X) :-
X = 'something',
fail.
@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 中编程的常用方法,但是如果您确切地知道自己在做什么...
是的,这就是 Prolog 中应该发生的方式。fail
表示拒绝到目前为止所做的绑定,因为它说这些绑定是无效的,不满足目标。
但是您可以保存一些将在回溯时撤消的绑定,例如asserta
predicate:
a(X) :-
X = 'something',
asserta(saved_x(X)),
fail.
然后,如果您saved_x(Z)
事后查询,您将恢复该值。当然,这是 Prolog 的额外逻辑部分,即在逻辑编程范式之外。