给定两个集合,检查第一个列表的每个奇数元素都包含在第二个列表中,并且第二个列表的每个偶数元素都不包含在第一个列表中。我不知道为什么我的代码不起作用:
isEvenMatch([], SecondList).
isEvenMatch([X|FirstList], SecondList):-
isEven(X),
member(X, SecondList),
isEvenMatch(FirstList, SecondList).
isOddNotMatch(FirstList, []).
isOddNotMatch(FirstList, [X|SecondList]):-
not(isEven(X)),
not(member(Y, FirstList)),
isOddNotMatch(FirstList, SecondList).
program(FirstList, SecondList):-
isEvenMatch(FirstList, SecondList),
isOddNotMatch(FirstList, SecondList).
member(X, [X|List]):-!.
member(X, [Y|List]):-member(X, List).
isEven(X):- Y is X mod 2, Y = 1.
谓词
isEvenMatch定义了收到奇数和收到空列表时的行为,但它没有告诉系统忽略偶数并继续下一个数字。因此,当被问及for ,
X = 1谓词可以用第二条规则证明; for ,X = 2第一条规则不能用,因为X不同意空列表,第二个没有被证明,因为X是偶数,谓词isEven返回false。Prolog 应该跳过一个偶数并移动到下一个,因此需要添加一个规则之后,如果奇数不在第二个列表中,则需要防止 prolog 尝试遵循新规则。为此,请切断进一步搜索:
谓词
isOddNotMatch是一样的。好吧,不要忽略有关 Singleton 变量的解释器提示。如果将所有未使用的变量替换为
_,您将看到在第二个谓词规则中,您isOddNotMatch在检查时member使用了变量Y,而不是X。并且在prolog中比较数字,最好使用操作符
=:=,而不是协议操作符=