2

我需要y = 1/x在一个数字列表上实现。

IE

inv (List1, ResultingList).

inv ([2 , 1 , 0 , 0.25 ] , R).
R = [ 0.5, 1, inf, 4.0 ].

我尝试过使用递归函数,但它不起作用。

这是我的“解决方案”:

    inv([], []).
    inv(list, R):- list == [H|T], T \== [], Y is (1/H),
        append(R, Y, R), inv(T);
        list = [H|T], T == [], R = T;
        list = [H|T], H == [0], append(R, "inf", R).

我知道有很多错误,但我找不到方法。

4

1 回答 1

2

变量名以大写字母开头,(==)/2仅用于极少数情况。此外append/3很少用于此类谓词。简要地:

inv([], []).
inv([X|Xs], [Y|Ys]) :-
   Y is 1/X,
   inv(Xs, Ys).

或者:

reciprocal(X, Y) :-
   Y is 1/X.

inv(Xs, Ys) :-
   maplist(reciprocal, Xs, Ys)

或使用library(lambda)

inv(Xs, Ys) :-
   maplist(\X^Y^(Y is 1/X), Xs, Ys).

请注意,最常见maplist/3的是在没有辅助定义的情况下直接调用。

但是,对于延续值的使用没有标准inf。如果你真的需要它,你必须自己做额外的处理。

于 2013-11-06T23:58:08.463 回答