ハノイの塔のプログラムを論理プログラミングしなさい。(Prologで実装しなさい。)
ソースコード
?- remove.
hanoi(N):-
hanoi(N,left,right,center).
hanoi(1,X,Y,Z):-
move(1,X,Y).
hanoi(N,X,Y,Z):-
-(N,1,M),
hanoi(M,X,Z,Y),
move(N,X,Y),
hanoi(M,Z,Y,X).
move(N,X,Y):-
write("move disc-"),
write(N),
write(" from "),
write(X),
write(" to "),
write(Y),
nl.
?- clear, listing.
?- hanoi(3).実行結果
hanoi(N) :-
hanoi(N,left,right,center).
hanoi(1,X,Y,Z) :-
move(1,X,Y).
hanoi(N,X,Y,Z) :-
-(N,1,M),
hanoi(M,X,Z,Y),
move(N,X,Y),
hanoi(M,Z,Y,X).
move(N,X,Y) :-
write("move disc-"),
write(N),
write(" from "),
write(X),
write(" to "),
write(Y),
nl.
yes
?- hanoi(3).
move disc-1 from left to right
move disc-2 from left to center
move disc-1 from right to center
move disc-3 from left to right
move disc-1 from center to left
move disc-2 from center to right
move disc-1 from left to right
yes
その他、感想
非手続き型プログラミング
非手続き型プログラミングをしてみて、手続きではないものというものかを知らなかったので、非手続き型でない意味が分かり、今までとは異なるプログラミング言語を学んだ感じがしました。
クリティカルなソフトウェア〜論理プログラミング〜
クリティカルなプログラムには論理的証明が必要であると言うことを改めて知りました。逆に、論理が成り立たないまたは論理的に考えずにプログラミングすると、いくらテスティングしてバグの発生確率を下げても、生命に関わる問題だったり、セキュリティホールが発生は起こりえる。だからこそ、プロダクトとして何か製品を出すときに、論理を怠ってはいけないと思いました。(プログラムの内容にも寄りますが。)
プログラミング言語
少し前よりも、スケジュールが空きだしたのと、今日言語を作るのは3年目(僕の知識は少ないですが)でも出来ることだと知ったので、プログラミング言語「Pladin」の前準備として、ある程度設計した後に字句解析を進めようと思います。