問題を「3桁の数3つの最大回文積を求めよ」と読み間違っていてずっと解答が合わずに頭を抱えていた。勘違いしていた問題のほうが本題より難しいがこちらの答えは以下のとおり967262769になるようだ。
1 ?- time(solve).
967262769=999*989*979
% 30,373,524 inferences, 16.703 CPU in 16.734 seconds (100% CPU, 1818434 Lips)
true
between述語のデクリメントバージョンdetween_decを作成して対応した。
プログラム:
% problem 4
solve:-
between_dec(999,100,Left3Dig),
number_chars(Left3Dig,NumChars),
[D1,D2,D3] = NumChars,
[D1,D2,D3,D3,D2,D1] = KaibunChars,
number_chars(Kaibun,KaibunChars),
between_dec(999,100,A),
Kaibun mod A =:= 0,
B is Kaibun / A,
100 =< B, B =< 999,
!,
write(Kaibun),write('='),write(A),write('*'),write(B),nl.
% decrimental version of between
between_dec(Max,Min,Val):-
integer(Val),
!,
Max >= Val,
Val >= Min.
between_dec(Max,Min,Val):-
var(Val),
between_dec_sub(Max,Min,Max,Val).
between_dec_sub(_,Min,Val,_):-
Val
fail.
between_dec_sub(Max,Min,Val,Val):-
Min =< Val,Val =< Max.
between_dec_sub(Max,Min,Val,RetVal):-
Val1 is Val - 1,
between_dec_sub(Max,Min,Val1,RetVal).
実行結果:
1 ?- time(solve).
906609=993*913
% 420,104 inferences, 0.219 CPU in 0.219 seconds (100% CPU, 1920475 Lips)
true.