SWI-Prolog目标失败变量绑定结果

时间:2013-04-28 10:03:42

标签: prolog

即使目标失败,我有没有办法在Prolog中获得变量的绑定。我有一个谓词,其中我绑定一个具有某个值的变量,在此之后我明确地失败了目标,但是当我运行查询时,它只会导致失败,而不为变量提供任何替换。类似的东西:

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

2 个答案:

答案 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,即之外的逻辑编程范例。