假设我有值列表,我想对每个值应用算术运算符。对于像加法这样的二元运算符,这意味着类似这样的事情:
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
调用每一对操作数,我无法弄清楚如何做到这一点。
我最初的感觉是可以使用=..
完成,我知道可以完成,但我不知道使用maplist
和maplist
是否更少黑客攻击。
答案 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)可能是有效评估的蓝图(通过重写)。数值算法库可以用它来获得最大效率。当然,这些优化应该在正确性之后推迟。