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を使用するかどうかはわかりません。maplistlambda

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

edit library( apply_macros ) は、(書き換えによる) 効率的な評価の青写真になる可能性があります。数値アルゴリズムのライブラリは、これを使用して最大の効率を得ることができます。もちろん、そのような最適化は正確さの後に延期する必要があります。

于 2013-02-18T13:16:37.710 に答える