2013-04-02 24 views
1

我在序言以下基礎:Prolog的切割操作的第一個謂詞

holiday(friday,may1). 
weather(friday,fair). 
weather(saturday,fair). 
weather(sunday,fair). 
weekend(saturday). 
weekend(sunday). 

picnic(Day) :- !,weather(Day,fair), weekend(Day). 
picnic(Day) :- holiday(Day,may1). 

當我運行picnic(When).我得到以下跟蹤:

[trace] ?- picnic(When). 
    Call: (6) picnic(_G716) ? creep 
    Call: (7) weather(_G716, fair) ? creep 
    Exit: (7) weather(friday, fair) ? creep 
    Call: (7) weekend(friday) ? creep 
    Fail: (7) weekend(friday) ? creep 
    Redo: (7) weather(_G716, fair) ? creep 
    Exit: (7) weather(saturday, fair) ? creep 
    Call: (7) weekend(saturday) ? creep 
    Exit: (7) weekend(saturday) ? creep 
    Exit: (6) picnic(saturday) ? creep 
When = saturday ; 
    Redo: (7) weather(_G716, fair) ? creep 
    Exit: (7) weather(sunday, fair) ? creep 
    Call: (7) weekend(sunday) ? creep 
    Exit: (7) weekend(sunday) ? creep 
    Exit: (6) picnic(sunday) ? creep 
When = sunday. 

我的疑問是:切割操作,正如我所知,當左側的謂詞停止搜索時!信號是真實的。第一個位置信號的含義是什麼?爲什麼解釋者不斷尋找可以使其他謂詞變爲真的另一個值?

回答

2

該剪輯的效果是,你的第二次野餐/ 1規則將被完全忽略。在你的計劃生命週期中,它永遠不會有機會開火。

但是回溯仍然在可用的備選方案(切割右側的目標)中工作,並且您可以在跟蹤中清楚地觀察它們。

+0

謝謝,現在我明白了剪切的意思。 –