Prologで小町算
http://karetta.jp/article/blog/ll-spirit/034942より。
komachi :- numlist(1, 9, L), komachi_build([''], L, L1), komachi_build([*, rdiv], L1, L2), komachi_build([+, -], L2, [T]), 100 is T, writeln(T), fail. komachi. komachi_build(_, [], []). komachi_build(Ps, [X,Y|Xs], Zs) :- member(P, Ps), ( P == '' -> Z is X * 10 + Y ; Z =.. [P, X, Y] ), komachi_build(Ps, [Z|Xs], Zs). komachi_build(Ps, [X|Xs], [X|Zs]) :- komachi_build(Ps, Xs, Zs).
'/'
じゃなくてrdiv
なのは有理数で計算するため。
逐次計算版。
komachi2 :- numlist(1, 9, L), komachi_build([''], L, L1), komachi_build([+, -, *, rdiv], L1, [T]), 100 is T, writeln(T), fail. komachi2.
最近Prologばっかりだなぁ。