2014-04-03 23 views
1

Prolog中的前綴如何工作?前綴附加在序言 - 它是如何工作的?

前綴應該返回列表的前綴。 例如:

?-prefix([1,2,3],X) 

(我不知道它是否應被寫爲相反:前綴(X,[1,2,3]) 將返回[],然後[1],則[ 1,2] ...

代碼:

prefix(Xs,Ys):- append(Xs,_,Ys). 

append([],Xs,Xs). 
append([X|Xs],Ys,[X,Zs]):-append(Xs,Ys,Zs). 

任何人都可以運行一個實例(追加只是增加了兩個字符串)

+1

變量必須以大寫字母開頭,否則它們不是變量。 – lurker

+0

我編輯過它。 – Ohad

回答

1

寫謂詞是正確的方法:

prefix(Xs, Ys) :- append(Ys, _, Xs). 

它說的是YsXs前綴如果Ys與其他一些附加名單(我不在乎它是什麼)是Xs

現在在序言中,當您發出查詢時,如append,並且謂詞是關係定義的,它將嘗試查找使查詢成爲TRUE的所有解決方案。如果我有查詢,append(Ys, _, [1,2,3]),序言可以通過實例Ys[]_[1,2,3](由此產生的解決方案,Ys = []使這個真,那麼它會走回頭路,找到另一種解決方案:。Ys[1]_[2,3]等等...

所以,當你運行你的查詢,你會得到:

| ?- prefix([1,2,3], X). 

X = [] ? ;   % append([], [1,2,3], [1,2,3]); X = [], _ = [1,2,3] 

X = [1] ? ;   % append([1], [2,3], [1,2,3]); X = [1], _ = [2,3] 

X = [1,2] ? ;  % append([1,2], [3], [1,2,3]); X = [1,2], _ = [3] 

X = [1,2,3]   % append([1,2,3], [], [1,2,3]); X = [1,2,3], _ = [] 

記住,序言旨在尋求通過檢查的事實和規則和實例變量的解決方案,如果有實例變量的方法不止一種。 ,它會bac ktrack。如果回溯發現另一組使查詢爲真的變量實例化,Prolog將顯示它爲解決方案。如果有更多的回溯可用,它會提示您輸入更多(並輸入;表示給我下一個)。

+0

你爲什麼改變了追加(Ys,_,Xs)中X和Ys的順序。 – Ohad

+0

@Shiran因爲這是追加工作的方式。你正在尋找一個列表('Ys'),當它附加到另一個列表('_')時,就會得到你的給定列表'Xs'。在'append'中,根據你如何定義'前綴(Xs,Ys)'的工作方式,'Xs'必須是追加操作的結果,'Ys'必須是被追加的第一個列表。因此,它們是相反的順序。我給出的示例說明說明了這一點。我可以做'prefix(Xs,Ys): - append(Xs,_,Ys).',但是我必須查詢'prefix(X,[1,2,3])。不是你要求它工作的方式。 – lurker