我想要一个谓词,它遍历一个列表列表,并检查每个列表是否验证了某些条件,如果列表验证了这些条件,它就会被添加到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
检查
想要处理三种不同情况的谓词通常应由三个子句组成。