寫謂詞是正確的方法:
prefix(Xs, Ys) :- append(Ys, _, Xs).
它說的是Ys
是Xs
前綴如果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將顯示它爲解決方案。如果有更多的回溯可用,它會提示您輸入更多(並輸入;
表示給我下一個)。
變量必須以大寫字母開頭,否則它們不是變量。 – lurker
我編輯過它。 – Ohad