将算术运算符应用于值列表

时间:2013-02-18 12:53:43

标签: prolog

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

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的{​​{1}}解决方案。更重要的是,如果没有member调用每一对操作数,我无法弄清楚如何做到这一点。

我最初的感觉是可以使用=..完成,我知道可以完成,但我不知道使用maplistmaplist是否更少黑客攻击。

1 个答案:

答案 0 :(得分: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)可能是有效评估的蓝图(通过重写)。数值算法库可以用它来获得最大效率。当然,这些优化应该在正确性之后推迟。