スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【同じタグを付けた記事の一覧】

Prolog がわからない

2015年01月08日(木)01時27分

Prolog 入門

前回「SWI-Prolog Portable を試す」において、Prolog を始めるということを書きました。
というわけで、とりあえず検索して見つけた「お気楽 Prolog プログラミング入門」というサイトで学習していたのですが、「8クイーン」までどうにか進めてみたところで、ついに「能力の限界」感がどうにもならないレベルに達し、途方に暮れて立ち止まることになりました。

Prolog がわからない

「Prolog がわからない」と言ってしまえばそれまでのことなのですが、正確には「わかることはわかる」のです。
入門サイトにて提示される「問い」と、その「答え」であるソースコードを、そこにつけられた解説を基に、丹念に「追っていく」ことで、確かに「その問題を解決できる仕組み」というものを理解はできます。
しかし、新たに次の「問い」が提示されても、その「答え」は全く思い浮かびません。
もちろん、それがまだ学んでいない知識を要するものであれば解けなくて当たり前なのですが、単なる「ここまでの理解の確認」的に出題される、復習問題のような「問い」にも、ことごとく歯が立たないのです。
ここまで手も足も出ないと、さすがに自分の脳味噌の出来の悪さに心が折れそうになります。

まずは「再帰」

おそらく、現時点で自分の「Prolog 理解」を阻んでいる最大の要因は「再帰」です。
そういえば、「C言語」では「ポインタ」と「再帰」が初学者にとっての大きな壁となる、という話をよく聞きますが、確かに自分も、「再帰」には大いに躓(つまづ)きました(何故か「ボインタ」に関しては難なく理解できましたが)。
しかし、それで「C言語習得を諦めた」のかと言えばそういうことはなく、「避けて通る」ことでそのまま前に進んだのです。
つまり、C++ でも JavaScript でも、これまで自分は「再帰」を一切使わずにきました。
確かに、「これは再帰を使えば簡潔に書けるのだろうな」と思うようなケースはあったものの、「再帰でなければ解けない」という問題に遭遇したことはなく、特にそれで困ることはなかったのです。
もっとも、プログラミングは自分にとって完全に「趣味」でしかないため、「再帰」を使わなければ複雑すぎて書けないような問題であれば、「諦める」か「別の手段で解決する」という手段を取れた、ということもありますが。

「再帰」理解を阻むもの

ところで、自分にとって「再帰」の何が理解を阻んでいるのかを考えたとき、おそらくそれは「追い切れなくなる」ことではないかと思います。
なにしろ、ある関数や述語が「再帰」で呼び出された時点で、「同じ名前の変数」が「全く別の物」になり、それがどんどん降り積もっていくのです。
もちろん、手続き型プログラミング言語におけるループ処理でも、一周ごとにループ内の変数は「新しい別物」で、またそれが何度も繰り返されるわけですが、ループの場合は一周ごとに処理が完結しているため、直前までのループに関しては「最後の結果」しか覚えている必要がありませんから、それほど脳の容量を使用せずに済みます。
ところが「再帰」の場合は、処理の途中でまた同じ処理が割り込んできますから、そこまでの「全ての結果」を、しかもややこしいことに「同じ名前で違う内容」の変数値として、脳内に置いておく必要があります。
実際、PC の方でも、再帰が深くなりすぎると、スタック内に記録しきれなくなってエラーが出るわけですが、自分の記憶容量は PC など全く比較にならない低容量ですから、当然、たちどころにパンクしてしまいます。

さらに「バックトラック」

そのうえで、さらに「バックトラック」によって「行きつ戻りつ」するわけで、こうなるともう、自分の脳のあまりに乏しい一時記憶容量では、完全に手に負えなくなります。
しかもこの「バックトラック」も、いまだに「どこまで戻るのか」「どこへ進むのか」「いつまで戻るのか」等々…、今一つ理解できていない、という現状があります。

「手続き型」の呪縛

…と、ここまでで述べてきた「理解できない理由」という言い訳は、つまるところ、自分の中にしみ込んだ「手続き型の呪縛」とでもいうべきものではないか、という気がします。
これまで自分が使ってきた、「手続き型言語」である C++ や JavaScript は、基本的に上から順に実行すべき命令文が並んでおり、実行位置が「飛ぶ」場合でも、「ここからここまで飛ぶ」「ここまで来たら元の位置へ戻る」ということが、ソースコード上に常に明示されています。
ですから、手間はかかりますが、処理の流れを一文一文追っていくことは全く容易なわけです。
ところが Prolog はそうではありません。
まあ、「再帰」は「手続き型」にもあるとはいえ、「ある時間軸上においてソースコード上の同一位置が多数の状態をもっている」という点で、「手続き型」の中でも異質な存在に感じますし、なにより、「バックトラック」という、Prolog 内部で勝手に行われる「見えない順路」があるため、「手続き型」と違い、「見ればわかる」とはいかないわけです。
にもかかわらず、「手続き型と同じ方法論で挑もうとしている」ということが、自分の「Prolog 理解」を妨げている要因であるのではないかと思います。
この辺り、なんとなくですが、多分 Prolog プログラミングというのは、「一つ一つ細かく中身を追っていく」のではなく、場数を踏んで「感覚」とでもいうべきものを身に付け、「こう書けばこうなる」という結論を基に組み立てていくものなのではなかろうか?というおぼろげな観念を抱いていたりはします。
ただ今のところ、自分がそういう「境地」に達することができそうな感触を、どうにも得られないでいるのです。

「append」の恐怖

もう一つ、Prolog をやっていて「これは無理」と感じたものに、「append」という二つのリストを「連結」する述語があります。
その実体は、以下の二行で表わされる非常に単純なものです。

append([],Xs,Xs).

append([X|Ls],Ys,[X|Zs]):-append(Ls,Ys,Zs).

これの何が「無理」なのか。
実はこの「append」は、「連結する述語」と書きましたが、実際には以下の4つの処理が行えます。

  1. 「append([1,2],[3,4],Z).」で、変数「Z」に「[1,2,3,4]」という二つのリストを「連結」した結果を得る。
  2. 「append(X,[3,4],[1,2,3,4).」で、変数「X」に「[1,2]」という「分割」した結果を得る。
  3. 「append(X,Y,[1,2,3,4).」で、変数「X」「Y」に連結して「[1,2,3,4」となる全ての組み合わせを得る。
  4. 「append([1,2],[3,4],[1,2,3,4]).」で、三つのリストの関係が正しいかを調べる。

自分にとっては、上記4つの動作が、たったの「二行」で記述できるという時点で、もうすでに「append」、ひいては Prolog という言語の「深さ」「恐ろしさ」を思い知るのに十分ではあります。
しかし、この「append」がさらに恐ろしいと感じるのは、この「二行」に Prolog の一部上級者しか知らないような「高度な機能やテクニック」は全く使われて「いない」という事実です。
「高度な」どころか、「カット」のような少し上級の概念すら使われておらず、それこそ Prolog の入門書の、一章か、せいぜい二章まで読めば載っているような、本当に Prolog の基礎の基礎と言っていい機能のみで実現されているのです。
この「append」という述語を見たとき、自分はある種の絶望感のようなものを覚えました。
それは、果たしてこの「append」の二行に、いつか自力で辿り着けるようになれるのだろうか?ということです。
例えばこの先、前節で述べたような「境地」に達し、すなわち再帰やバックトラックが「感覚」で使えるようになり、曲がりなりにも Prolog が書けるようになれたとして、また、そこからさらに精進を重ねたとしても、「到底無理なのではないか」としか思えなかったのです。
「append」のこの二行には、Prolog 初学者にそういう衝撃を与えるのに十分な破壊力があるように感じます。

気楽にもう少し

…とまあ、今回あまりの Prolog のわからなさに、つい何の役にも立たない愚痴を長々と書いてしまいましたが、しかし、自分にとってこの Prolog というものは、学校の課題というわけでも、仕事でやらざるを得ないというわけでもありませんから、「どうしても習得しなければならない」というような「義務」も、「いつまでに習得しなければならない」というような「期限」もない「気楽さ」はあります。
また、自分の意志で始めることを決め、わざわざブログにまで書いておいて、「今更引けるか」という、ちょっとした意地のようなものもあります。
ということで、もう少しの間は、気楽に、気長に続けてみようかと思っています。

関連記事

【同じタグを付けた記事の一覧】
プログラミング Prolog

スポンサーサイト

コメントの投稿

非公開コメント

No title

こんにちは、僕もProlog結構好きで勉強しています。SWI-Prologを使っています。

いくつかパズルのソルバーを作ってみました。
http://www2.koyahatataku.com/sapporo_chess/prolog.html

今は制約論理プログラミング(CLPFD)のライブラリに興味があり、勉強しています。
Tantrixというパズルのソルバーを制約論理プログラミングで作るろうとしているのですが、
考え方がなかなか難しいですね。多分いつかできると思います。

一緒にがんばりましょう!

Re: No title

はじめまして、小屋畑拓さん。
制約論理や並行論理には、とてもロマンを感じています。
思い起こせばPrologに対しても、はじめはそういう感情から入っていったような気がします。
…と言っても、いまだに入り口付近でうろうろしている状態で、
現状では、サンプルプログラムに毛の生えた程度のすごく簡単なものしか書けないのですが。
でも本当に興味深い言語ですので、これからもゆっくりコツコツ続けていくつもりです。
「Prolog道」への同道、こちらこそよろしくお願いします!
最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
161位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
19位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。