2013-04-28 72 views
1

是否有任何方法可以在Prolog中爲變量綁定,即使目標失敗。我有一個謂詞,我綁定了一個具有某個值的變量,在此之後,我明確地失敗了目標,但是當我運行查詢時,只會導致失敗,而不會爲該變量提供任何綁定。類似的東西:SWI-Prolog目標失敗變量綁定結果

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

您是否還有代碼中的某個'(_)。'規則?看起來你試圖用'失敗'強制回溯,對吧? – dasblinkenlight 2013-04-28 10:09:57

回答

2

是的,這是它應該如何在Prolog中發生。 fail意味着拒絕綁定到目前爲止,因爲它說這些綁定是無效的,不符合目標。

但您可以保存一些綁定,這些綁定在回溯時將被撤消,例如, asserta predicate

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

然後,如果查詢saved_x(Z)之後,你將恢復該值。當然,這是Prolog的一部分,它是多餘的-邏輯,即外部的邏輯編程範例。

+0

全局狀態和'assert'是非常不可思議的,儘管......我認爲OP應該解釋他想要做什麼,否則很難提出一個合適的解決方案。 – dasblinkenlight 2013-04-28 10:14:08

+0

@dasblinkenlight不能同意更多。 – 2013-04-28 10:14:37

+0

在執行過程中使用'asserta/1'斷言的事實不會在回溯時收回......它們會產生副作用!儘管如此,它們確實可以用來像你所示的那樣捕獲中間狀態(+1)。 – sharky 2013-04-28 10:25:42

3

@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中編程的常用方法,但是如果您確切知道您在做什麼......