2010-10-23 169 views
0

我可以編寫一個謂詞,當兩個列表相等時,例如,相等([2,3],[2,3])爲真且相等([2,3],[4,5])。將是錯誤的。匹配多個列表

但是,如果我想列出一個列表並嘗試將它與列表列表中的任何列表進行匹配,例如匹配([2,3],[[5,6],[4,6,2],[2,3]])。因爲列表中的最後一個列表但匹配([2,3],[[3,4],[4,2,1]]),所以這是真的。將是錯誤的,因爲[2,3]不匹配列表列表中的任何內容。

我在想也許我們可能需要在這裏嵌套遞歸?任何想法你如何做到這一點?我試圖解決的問題要大得多,但只要能夠做到這一點就能讓我解決整個問題。

回答

0

Prolog列表的遞歸導航通常通過幾個子句來實現:第一個是停止遞歸併返回結果的條件;第二個包含遞歸調用。爲了達到這個目的,在每個子句的頭部,遞歸必須被執行的列表通常被分成兩部分,將第一個元素(稱爲頭部)與列表的其餘部分(稱爲尾部)隔離開,例如在以下:

p(Element, [Head | Tail]) :- % ... 

在遞歸條款,您處理Head,並根據其結果,就繼續打電話給你的謂詞傳遞Tail作爲第二個參數,因此實際上每次瀏覽整個列表中的一個元素。在編寫這樣一個謂詞時,當你找到你正在查找的結果時,你可能會削減(使用!)替代解決方案(有時只會產生失敗)。在你的情況下,一旦你在第一個列表和第二個列表中的一個元素之間找到一個匹配項,你就不需要繼續下去了,所以應該修剪任何可能在演示樹中打開的分支。

+0

感謝您的回答朱利奧。然而,我知道遞歸,基礎案例,遞歸案例,正面,尾部,裁剪,匹配頭等。我的問題是,我有這樣的事情:match([2,3],[[4,5],[7 ,8],[2,3]])。我想知道你如何將我的[2,3]與嵌套列表相匹配,即我對如何將列表與列表中的單個列表進行匹配相混淆。我會繼續努力,併發布我所做的任何進展答案。對此有何建議?非常感謝。 – ale 2010-10-23 14:16:32

0

UPDATE:我想象事情更加複雜,因爲嵌套的名單,但像這樣簡單的實際工作的東西:

match(Search, [H|_]) :- 
    Search = H, !. 
match(Search, [H|T]) :- 
    Search \= H, 
    match(Search, T). 

朱利奧,你的答案是這樣的感謝非常有幫助:)。

+0

在閱讀你對我的回答的評論後,我剛剛提醒你有關你的第一個條款,但我看到你自己解決了它。尼斯。無論如何,作爲獎勵:第一個子句可以直接寫成match(搜索,[Search | _]): - !。,在搜索兼容子句時利用Prolog執行的基礎統一。 – 2010-10-23 21:45:34