你不应该使用削减(!
目标)。剪切是一个高级的 Prolog 概念,只有当您成为更高级的 Prolog 程序员时才有用。在此之前,削减只会让你感到困惑。此外,削减通常不会使你的计划更频繁地成功,但会使其更频繁地失败。你的问题是你的程序失败得太频繁了!削减可能是您问题的一部分。
另外,你的程序总是返回 false 并不完全正确。看,它确实适用于某些输入:
?- evenproduct(3, [2, 4, 6], Ys).
Ys = [6, 12, 18].
也就是说,如果给定的列表仅包含偶数,则您的程序将完全按照预期运行。到目前为止做得很好!
您现在需要做的是在列表中的数字之一为奇数的情况下也能成功。有一种主要方法可以使 Prolog 程序更频繁地成功:向某些谓词添加更多子句。
你的定义evenproduct/3
到目前为止有两个条款。也许到目前为止您所看到的所有列表处理谓词总是有两个子句,一个用于“基本情况”,一个用于“递归情况”。但有几个非递归或几个递归子句是完全可以的,而且通常是非常必要的。对于您的情况,您可以将以下子句添加到您的程序中以使其正常工作:
evenproduct(F,[X|Xs], [Y|Ys]) :-
Y = X,
X mod 2 =:= 1,
evenproduct(F, Xs, Ys).
所以现在你将拥有three总共有 1 个非递归子句和 2 个递归子句。
现在奇数也被接受:
?- evenproduct(3, [1, 2, 3, 7, 11, 22], Ys).
Ys = [1, 6, 3, 7, 11, 66] ;
false.