2016-11-04 19 views
1

基本問題:謂詞失敗時如何分配給實例變量?即使謂語失敗,Prolog也會實例化並分配變量

我有兩個謂詞「功能」(可能是錯誤的術語)。第一個謂詞用一個新的實例化變量(未分配)調用第二個謂詞。我爲第二個謂詞中的新變量賦值。但是,第二個謂詞失敗。我實現它的方式,由於謂詞失敗,新變量在返回第一個謂詞後仍然未賦值。

func(X, Y) :- 
    func2(X, NewX); 
    write(NewX). 

func2(X, NewX) :- 
    NewX is X+1, false. 

此打印:

| ?- func(1,1). 
_283 

但是,如果第二個謂詞返回像這樣真實,

func(X, Y) :- 
    func2(X, NewX), 
    write(NewX). 

func2(X, NewX) :- 
    NewX is X+1. 

然後打印:

| ?- func(1,1). 
2 

yes 

我如何分配一個謂詞失敗的實例?

回答

1

在Prolog,當謂詞調用失敗,通話結束後創建的所有變量綁定都在回溯撤消。因此,沒有辦法在純Prolog中「失敗  統一」。


解決您的問題,在純序言,聲明描述了案件持有

例如,在你的情況,你顯然有2可能的情況

  • 要麼NewX等於X + 1

所以,在Prolog中,這可能會閱讀:

integer_successor(X0, X, true) :- X #= X0 + 1. 
integer_successor(X0, X, false) :- X #\= X0 + 1. 

根據這些定義,現在可以使用:

integer_successor(X, NewX, Truth) 

,然後用Truth區分的情況。

例如:

other_pred(true) :- ... 
other_pred(false) :- ... 

這可讓您通過模式匹配描述不同的情況,並保留和代碼的通用性:您可以使用此作爲一個真正的關係,在各個方向,包括所有參數都是免費 變量的最一般查詢。

相關問題