即使目标失败,我有没有办法在Prolog中获得变量的绑定。我有一个谓词,其中我绑定一个具有某个值的变量,在此之后我明确地失败了目标,但是当我运行查询时,它只会导致失败,而不为变量提供任何替换。类似的东西:
a(X) :-
X = 'something',
fail.
答案 0 :(得分:3)
@Will Ness是正确的(+1),assert
可用于捕获变量的绑定,如图所示。
但是,如果严格需要检索a
等谓词中的变量绑定,并且知道哪些部分可能会失败(并且您 don关心他们),然后你可以使用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中编程的常用方法,但如果您确切知道自己在做什么......
答案 1 :(得分:2)
是的,这就是Prolog应该发生的事情。 fail
表示拒绝到目前为止所做的绑定,因为它表示这些绑定无效,不符合目标。
但你可以保存一些在回溯时撤消的绑定,例如asserta
predicate:
a(X) :-
X = 'something',
asserta(saved_x(X)),
fail.
然后,如果您之后查询saved_x(Z)
,您将恢复该值。当然,这是Prolog的一部分 extra -logical,即在之外的逻辑编程范例。