ECLiPSe CLP で解きました。
ほぼPure Prolog で、制約論理の述語は使用してません。
自分のマシンで約9秒。
プログラム:
:-lib(util).
:-dynamic(cubic_sorted/2).
go:-
retractall(cubic_sorted(_,_)),
between(1,1000000000000,I),
CubicNum is I * I * I,
digit_sort(CubicNum,Sorted),
assert(cubic_sorted(Sorted,I)),
findall(Num,cubic_sorted(Sorted,Num),NumLst),
length(NumLst,NumLen),
(
NumLen>=5->
sort(NumLst,NumLstSorted),
[First|_]=NumLstSorted,
CubeFirst is First * First * First,
printf(output, "CubicNum %d ,Lst %w", [CubeFirst, NumLst]),nl,
true
;
fail
)
.
digit_sort(Num,Sorted):-
num2lst(Num,Lst),
msort(Lst,Sorted).
% convert number to list(reversed)
num2lst(0,[]):-!.
num2lst(Num,[Dig|DigRst]):-
Dig is Num mod 10,
RestNum is Num // 10,
num2lst(RestNum,DigRst).
コマンドライン:
?- time(go).
Yes (9.22s cpu)
標準出力:
<解答伏せます。>
Success, times: 9.218750s thread, 9.219+0.000s process, 9.224s real
30年ほど前にDEC-2060のprologとPSIのESPで開発をしていました。当時、研究所の方が制約プログラムとしてtau言語(?)をESPで作成し、魔法陣をtau環境で実行しました。
M.Hiroi’s Home Page で制約論理プログラムを見つけて魔法陣がSWI-prolog, clpfdで短時間に解けることに驚き、このページにたどり着き、ECLiPse_clpの導入を開始しています。
Tensorflowを個人で勉強してDeepLearningは目の機能を実現してもAIには遠いと感じていました。prologには将来性があると思っています。ECLiPse_clpの情報発信に期待します。
うわー返信ものすごく遅れて大変申し訳ありません!!!来るコメントすべてスパムばかりだったのでブログのコメントページを全く見ておりませんでした。
中島さんのコメントのtau言語、ESP、Tensorflowどれもあまりよくわからなかったので勉強します。
ECLiPSeは現在も勉強中ですので気が向いたらブログ書くようにします。
ECLiPSeのtutorialのpdfがかなり良い資料で、これを読んでいるだけで制約論理プログラミングがどのようなものかがおぼろげに分かってくるような感じがします。
ECLiPSe CLP tutorial