Prolog -将列表中的偶数元素乘以一个数字(F)



我在Prolog中编程,从任何给定的数字(F)中寻找,以乘以列表的偶数元素;保留那些不存在的值,开发了下面的代码,实际上程序"编译"了。没有任何错误,但是当输入值时,它只返回"false",我哪里错了?:

% base case
evenproduct(_,[],[]) :- !.
% recursive case
evenproduct(F,[X|Xs], [Y|Ys]) :-
Y is F*X,
X mod 2 =:= 0,
evenproduct(F, Xs, Ys), !.

谢谢! !

你不应该使用cut (!目标)。cut是一个高级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).

现在你总共有三个子句,一个非递归,两个递归。

现在奇数也被接受了:

?- evenproduct(3, [1, 2, 3, 7, 11, 22], Ys).
Ys = [1, 6, 3, 7, 11, 66] ;
false.

最新更新