在每个列表元素上应用谓词

时间:2013-11-06 23:46:54

标签: list lambda prolog

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

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).

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

1 个答案:

答案 0 :(得分: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的使用没有标准。如果你真的需要它,你必须自己做额外的处理。