Prolog 匹配多个列表

Prolog 匹配多个列表,prolog,Prolog,我可以写一个当两个列表相等时满足的谓词,例如equal([2,3],[2,3])将为true,equal([2,3],[4,5])。这是错误的 但是,如果我想要一个列表并尝试将其与列表列表中的任何列表进行匹配,例如匹配([2,3],[5,6],[4,6,2],[2,3]]),该怎么办。将为true,因为列表列表中的最后一个列表不匹配([2,3],[3,4],[4,2,1]])。将为false,因为[2,3]与列表列表中的任何内容都不匹配 我在想也许我们需要嵌套递归?知道你是怎么做到的吗?我试图解

我可以写一个当两个列表相等时满足的谓词,例如equal([2,3],[2,3])将为true,equal([2,3],[4,5])。这是错误的

但是,如果我想要一个列表并尝试将其与列表列表中的任何列表进行匹配,例如匹配([2,3],[5,6],[4,6,2],[2,3]]),该怎么办。将为true,因为列表列表中的最后一个列表不匹配([2,3],[3,4],[4,2,1]])。将为false,因为[2,3]与列表列表中的任何内容都不匹配


我在想也许我们需要嵌套递归?知道你是怎么做到的吗?我试图解决的问题要大得多,但只要能够做到这一点,我就能解决整个问题。

Prolog列表的递归导航通常通过两个子句实现:第一个是停止递归并返回结果的条件;第二个包含递归调用。为此,在每个子句的头中,必须执行递归的列表通常分为两部分,将第一个元素(称为头)与列表的其余部分(称为尾)隔离开来,如下所示:

p(Element, [Head | Tail]) :- % ...
在该递归子句中,您处理
Head
,并根据结果继续调用谓词passing
Tail
,作为第二个参数,从而一次实际导航整个列表中的一个元素


在编写这样一个谓词时,当您找到所要查找的结果时,您可以(使用
)剪切替代解决方案(有时只会产生失败),例如,在您的情况下,一旦您找到第一个列表和第二个列表中的某个元素之间的匹配,您就不需要进一步进行,因此,应该修剪演示树中任何可能打开的分支。

更新:我想象事情会因为嵌套列表而变得更复杂,但像这样简单的事情实际上是可行的:

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

朱利奥,你的回答很有帮助,所以谢谢:)。

谢谢朱利奥的回答。然而,我知道递归、基本情况、递归情况、头、尾、切、匹配头等。我的问题是我有这样的东西:匹配([2,3],[4,5],[7,8],[2,3]])。我想知道如何将我的[2,3]与嵌套列表匹配,也就是说,我不知道如何将整个列表与列表列表中的单个列表匹配。我会继续努力,并张贴我取得的任何进展的答案。有什么建议吗?非常感谢。在阅读了你对我的答案的评论之后,我正要向你暗示你的第一个条款,但我看到你自己解决了它。美好的无论如何,作为奖励:第一个子句可以写成
match(Search[Search |)]:-直接,利用Prolog在搜索兼容子句时执行的底层统一。