我需要在数字列表上实现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).
我知道有很多错误,但我找不到方法。
答案 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
的使用没有标准。如果你真的需要它,你必须自己做额外的处理。