我使用SWI Prolog的學習Prolog的一個大學考試,我對之間的下列問題的兩種不同解決方案的差異有些疑惑使用CUT中的一些問題:關於這段序言鍛鍊
定義條款計數(X,L,NumX)其中X是原子,L是 列表和NumX是出現的次數即X出現在L.
這是第一個解決方案:
count0(_,[],0).
count0(A, [A|Tail], N) :-
count0(A,Tail,N1), % L'elemento cercato appare N1 volte nella sottolista
N is N1+1. % N vale N1+1
count0(A, [B|Tail], N) :-
A\=B, % A è diverso da B
count0(A,Tail,N). % N è il numero di occorrenze di A nella sottolista
這是第二個解決方案:
count1(_,[],0).
count1(A, [A|Tail], N) :- !,
count1(A, Tail, N1),
N is N1+1.
count1(A, [_|Tail], N) :- count1(A, Tail, N).
我的問題是,我不理解它扮演的角色在第二版的CUT
我知道CUT防止回溯在CUT被放置的特定點。
該程序的第一個版本檢查A是否與第二條規則中的B不同(我需要這個?如果第一條規則失敗了,所以這意味着A不與該頭的頭部統一該列表的頭是從A處的元素)
第二個版本不執行此檢查在第二個規則,但把削減的第一條規則不同...
這可能取決於由事實上(在第二個版本中)如果我不阻止回溯,那麼:在此之後,如果我強制使用回溯,Prolog給我第一個(正確)迴應;碰巧使用第二條規則:
count1(A, [_|Tail], N) :- count1(A, Tail, N).
採取了不同的分支在計算和該分支我沒有N是N + 1?
好吧,現在對我來說更加清楚......最後一個問題是:在程序的第二個版本中(使用剪切),規則的順序很重要,是對的嗎? – AndreaNobili 2013-04-11 16:29:17
@AndreaNobili:是的,這很重要。如果你交換最後兩個子句,你會得到不正確的結果(也是正確的)。 – gusbro 2013-04-11 16:49:41