2010-10-23 170 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