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

SWI Prolog目标失败变量绑定结果,prolog,Prolog,是否有任何方法可以在Prolog中为变量获取绑定,即使目标失败。我有一个谓词,在这里我用某个值绑定一个变量,然后我显式地失败了目标,但是当我运行查询时,它只会导致失败,而没有为变量提供任何出价。类似的东西: a(X) :- X = 'something', fail. 是的,在Prolog中应该是这样的fail表示拒绝迄今为止所做的绑定,因为它表示这些绑定无效,不能满足目标 但您可以保存一些将在回溯时撤消的绑定,例如: 然后,如果随后查询saved_x(Z),您将恢复该值。当然,这是Pro

是否有任何方法可以在Prolog中为变量获取绑定,即使目标失败。我有一个谓词,在这里我用某个值绑定一个变量,然后我显式地失败了目标,但是当我运行查询时,它只会导致失败,而没有为变量提供任何出价。类似的东西:

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

是的,在Prolog中应该是这样的
fail
表示拒绝迄今为止所做的绑定,因为它表示这些绑定无效,不能满足目标

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


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

是的,这就是在Prolog中应该发生的情况
fail
表示拒绝迄今为止所做的绑定,因为它表示这些绑定无效,不能满足目标

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

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

@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中编程的常用方法,但如果您确切知道自己在做什么…

@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中编程的常用方法,但如果您确切知道自己在做什么…

您的代码中是否也有
a(u389;)规则?看起来您正试图使用
fail
强制回溯,对吗?您的代码中是否也有
a(389;)规则?看起来你想用
fail
强制回溯,对吧?虽然全局状态和
assert
都不是序言,但是。。。我认为OP应该解释他想做什么,否则就很难找到合适的解决方案。@dasblinkenlight非常同意。在执行过程中使用
asserta/1
向DB断言的事实不会在回溯时收回。。。它们会产生副作用!尽管如此,它们确实可以用来捕获中间态,如您所示(+1)。@sharky是的,我想这就是我所说的。:)绑定被收回,因此我们使用
断言
(如果必须)保存它们。。。。更改了一些措辞,谢谢。我要说的是,在回溯时绑定丢失,并且使用
assert/1
断言的事实在回溯时不会收回。这有明显的区别!全局状态和断言(assert)
都不是序言,不过。。。我认为OP应该解释他想做什么,否则就很难找到合适的解决方案。@dasblinkenlight非常同意。在执行过程中使用
asserta/1
向DB断言的事实不会在回溯时收回。。。它们会产生副作用!尽管如此,它们确实可以用来捕获中间态,如您所示(+1)。@sharky是的,我想这就是我所说的。:)绑定被收回,因此我们使用
断言
(如果必须)保存它们。。。。更改了一些措辞,谢谢。我要说的是,在回溯时绑定丢失,并且使用
assert/1
断言的事实在回溯时不会收回。这有明显的区别!