経路探索のプログラムを論理プログラミングしなさい。(Prologで実装しなさい。)
ソースコード
?- remove. connect(entrance,a). connect(a,b). connect(a,h). connect(b,c). connect(b,i). connect(c,j). connect(d,e). connect(d,k). connect(e,f). connect(f,g). connect(f,m). connect(h,i). connect(h,o). connect(i,j). connect(j,k). connect(j,q). connect(k,l). connect(k,r). connect(m,n). connect(m,t). connect(p,w). connect(r,y). connect(s,t). connect(s,z). connect(t,u). connect(v,w). connect(w,x). connect(x,y). connect(v,exit). connect(z,exit). route(exit,P,R) :- reverse(P,R). route(X,P,R) :- connect(X,T), not(member(T,P)), route(T,[T|P],R). route(X,P,R) :- connect(T,X), not(member(T,P)), route(T,[T|P],R). route(R) :- route(entrance,[entrance],R). ?- route(X).
実行結果
yes ?- route(X). X = [entrance,a,b,c,j,k,r,y,x,w,v,exit] ; X = [entrance,a,b,c,j,k,d,e,f,m,t,s,z,exit] ; X = [entrance,a,b,i,j,k,r,y,x,w,v,exit] ; X = [entrance,a,b,i,j,k,d,e,f,m,t,s,z,exit] ; X = [entrance,a,h,i,j,k,r,y,x,w,v,exit] ; X = [entrance,a,h,i,j,k,d,e,f,m,t,s,z,exit] ; X = [entrance,a,h,i,b,c,j,k,r,y,x,w,v,exit] ; X = [entrance,a,h,i,b,c,j,k,d,e,f,m,t,s,z,exit] ; no
その他、感想
論理プログラミング
論理プログラミングしてみて、route(X,P,R)の文に関して、今まで使ってきたプログラミング言語とは違い、引数の型の種類および数が同じであるのに、プログラムが解析されている。この辺りの意味解析の方法はかなり不思議に思いました。それから、Cでいうif, elseが一行で表現されていて、新しい言語を作る上でうまく利用できないかなあと思いました。
プログラムの未来系「対話」
Prologは対話を重点的に意識した言語だなあと思います。例えば、プログラム実行中に「よろしいですか?」と問いかける部分など、人間とプログラムが繋がってきていると思います。最近になって、プログラミング言語Paladinを作ったり、Prolog, Python, Rubyを使って行くなかで、徐々にプログラムとの対話に関して真剣に考えるようになってきました。僕が思うに、将来というよりも、未来ではプログラマはかなり減少して、プログラムと人間が対話して、人間との対話によってプログラミングが成り立つという時代に変わると思います。すなわち、対話こそがプログラミングの未来系だと思います。そして、Prologも新たな言語のideaとして参考にしようと思いました。
「対話」のデメリット〜対話を考える〜
ただ、デメリットがあるとも思います。それを最近頭の中で考えていたのですが、もし対話が成り立ちプログラムがプログラムを書き換えることになった場合、人間のような振る舞いを見せたなら、人間に起きていることがコンピュータに起こると思います。つまり、人間が事故で脳の一部分を損傷したり、遺伝子的、神経的変異が起きて、普通でなくなる可能性がある。もし、プログラムでそれが起こったなら、WWWにも多大な影響を起こしますし、様々な分野で問題が発生します。なので、どこまでの対話を実現し、対話によって、どこまでのことをプログラムにさせるかは、しっかり見積もらなくてはならないと思いました。