当两个列表相等时,我可以编写一个满足的谓词,例如等于([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 :(得分:0)
Prolog列表的递归导航通常通过几个子句来实现:第一个是递归停止并返回结果的条件;第二个包含递归调用。为此目的,在每个子句的头部中,必须执行递归的列表通常分为两部分,将第一个元素(称为头部)与列表的其余部分(称为尾部)隔离,例如在以下内容:
p(Element, [Head | Tail]) :- % ...
在该递归子句中,您处理Head
,并根据结果继续调用谓词,将Tail
作为第二个参数传递,从而实际上一次导航整个列表一个元素。
在编写这样的谓词时,您可以在找到所需的结果时剪切(使用!
)替代解决方案(有时只产生失败),例如:在您的情况下,一旦您在第一个列表和第二个列表中的元素之间找到匹配项,您就不需要继续进行,因此应该修剪演示树中任何可能打开的分支。
答案 1 :(得分:0)
更新:由于嵌套列表,我想象事情变得更复杂,但实际上这很简单:
match( Search, [H|_] ) :-
Search = H, !.
match( Search, [H|T] ) :-
Search \= H,
match( Search, T ).
Giulio,你的回答非常有用,谢谢:)。