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ばっかりだなぁ。