需要将所有奇数和超过给定数量的值从第二个列表添加到第一个。我确实喜欢这样:
add_to_list(L, X, [X|L]).
isEven(X):- 1 is X mod 2.
add_even(_, [], _, _).
add_even(FirstList, [X|SecondList], ResultList, Z):-
isEven(X),!,
X > Z,!,
add_to_list(FirstList, X, ResultList),
add_even(FirstList, SecondList, ResultList, Z).
add_even(FirstList, [_|SecondList], ResultList, X):-
add_even(FirstList, SecondList, ResultList, X).
但是,它根本不会生成任何列表,而是返回 true/false
?- add_even([1, 2, 3], [3, 4, 5], X, 4).
Result: false
这里有一个额外的截止算子
isEven(X),一个奇数条件和X > Z一个一般条件,如果这些部分中至少有一个是假的,那么你需要继续进一步寻找解决方案,即进入第三条规则add_even。并且使用 cut 运算符,当找到小于 Z 的奇数时,您可以阻止 Prolog 使用第三条规则。UPD
add_to_list当第三个参数是带有 headX和 body的列表时,谓词将返回 trueL。在第一遍ResultList它还没有被实例化,所以匹配发生了,在第二遍ResultList它已经被实例化并且匹配是不可能的,因为列表的头部不等于X。在这种情况下,将元素添加到结果列表需要使用更多参数或列表
FirstList:立即添加元素是
ResultList行不通的,因为退出递归时,值ResultList会回滚\u200b\u200b。