1

假设我有值列表,我想对每个值应用算术运算符。对于像加法这样的二元运算符,这意味着如下:

add_lists([],[],[]).
add_lists([A|TA],[B|TB],[R|TR]) :- R is A+B,
                                   add_lists(TA,TB,TR).

现在我想写一些类似的东西:

?- arithop_lists(+,[1,2,3],[0.2,-2,100],R).

这有效:

arithop_lists(_Op,[],[],[]).
arithop_lists(Op,[A|TA],[B|TB],[R|TR]) :- E =.. [A,Op,B], R is E,
                                          arithop_lists(Op,TA,TB,TR).

但我非常沮丧,因为我找不到更简单的方法来做到这一点。我想不出一个findall不使用member. =..更重要的是,如果不调用每对操作数,我无法弄清楚如何做到这一点。

我最初的感觉是它可以用 来完成maplist,而且我知道它可以完成,但我不知道是否使用maplistandlambda是一个 hack。

4

1 回答 1

0

我认为更好的方法,效率方面,应该是

add(A, B, C) :- C is A + B.
mul(A, B, C) :- C is A * B.

产量

?- X = add, maplist(X, [1,2,3], [0.2,-2,100], R).
X = add,
R = [1.2, 0, 103].

?- X = mul, maplist(X, [1,2,3], [0.2,-2,100], R).
X = mul,
R = [0.2, -4, 300].

编辑库(apply_macros)可能是高效评估的蓝图(通过重写)。数值算法库可以使用它来获得最大效率。当然,这样的优化应该在正确性之后推迟。

于 2013-02-18T13:16:37.710 回答