Prolog通过列表递归



我想要一个谓词,它遍历一个列表列表,并检查每个列表是否验证了某些条件,如果列表验证了这些条件,它就会被添加到ResultList(另一个列表(中。我写了这个:

mypredicate(ListOfLists, ReferenceList, ResultList) :-
mypredicate(ListOfLists, ReferenceList, ResultList, []),
mypredicate([H|T], ReferenceList, ResultList, Acc) :-
elementos_comuns(ReferenceList, H),
H == ReferenceList,
append(Acc, H, ResultList),
T == [],
mypredicate(T, ReferenceList, ResultList, ResultList).

我只想在"append"上面的两行都返回true的情况下进行追加,不管前3行发生了什么,如果T\==[],我希望它运行最后一行。

问题是,当它到达ListOfLists的一个元素时,它没有验证这两个元素中的一个:

elementos_comuns(ReferenceList, H),
H == ReferenceList,

整个结果都是假的。

我需要ResultList是一个列表列表,其中包含验证的"ListOfList"列表

elementos_comuns(ReferenceList, H),
H == ReferenceList,

我不知道该怎么做,任何帮助都很感激。

假设您使用某个列表[A, B, C]调用mypredicate。它将检查A上的一些条件,然后用[B, C]递归。它将检查B上的一些条件,然后用[C]递归。它将检查C上的一些条件,但是,由于T现在是[],它将在T == []处失败。当你有这种情况时,你的谓词没有成功的机会。您可能应该删除它,并添加另一个形式为mypredicate([], ..., ..., ...)的子句。

即便如此,谓词也只能处理满足所有条件的情况。一旦在elementos_comuns/2失败的列表上运行它,它就会失败。

有三种不同的情况需要处理:

  • 空列表
  • 列出[H | T],其中H满足elementos_comuns/2检查
  • 列出[H | T],其中H不满足elementos_comuns/2检查

想要处理三种不同情况的谓词通常应由三个子句组成。

最新更新