是否有任何方法可以在Prolog中爲變量綁定,即使目標失敗。我有一個謂詞,我綁定了一個具有某個值的變量,在此之後,我明確地失敗了目標,但是當我運行查詢時,只會導致失敗,而不會爲該變量提供任何綁定。類似的東西:SWI-Prolog目標失敗變量綁定結果
a(X) :-
X = 'something',
fail.
是否有任何方法可以在Prolog中爲變量綁定,即使目標失敗。我有一個謂詞,我綁定了一個具有某個值的變量,在此之後,我明確地失敗了目標,但是當我運行查詢時,只會導致失敗,而不會爲該變量提供任何綁定。類似的東西:SWI-Prolog目標失敗變量綁定結果
a(X) :-
X = 'something',
fail.
是的,這是它應該如何在Prolog中發生。 fail
意味着拒絕綁定到目前爲止,因爲它說這些綁定是無效的,不符合目標。
但您可以保存一些綁定,這些綁定在回溯時將被撤消,例如, asserta
predicate:
a(X) :-
X = 'something',
asserta(saved_x(X)),
fail.
然後,如果查詢saved_x(Z)
之後,你將恢復該值。當然,這是Prolog的一部分,它是多餘的-邏輯,即外部的邏輯編程範例。
全局狀態和'assert'是非常不可思議的,儘管......我認爲OP應該解釋他想要做什麼,否則很難提出一個合適的解決方案。 – dasblinkenlight 2013-04-28 10:14:08
@dasblinkenlight不能同意更多。 – 2013-04-28 10:14:37
在執行過程中使用'asserta/1'斷言的事實不會在回溯時收回......它們會產生副作用!儘管如此,它們確實可以用來像你所示的那樣捕獲中間狀態(+1)。 – sharky 2013-04-28 10:25:42
@Will Ness正確(+1),assert
可以用來捕獲變量的綁定,如圖所示。
不過,如果你嚴格需要檢索謂詞變量綁定像a
你知道這部分可能會失敗(和你不關心他們),那麼你可以使用切割組合(!
)和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中編程的常用方法,但是如果您確切知道您在做什麼......
您是否還有代碼中的某個'(_)。'規則?看起來你試圖用'失敗'強制回溯,對吧? – dasblinkenlight 2013-04-28 10:09:57