\chapter{ Logoとは何か}
\section{Logoの特徴}
Logoは教育用言語\index{きょういくようけんこ@教育用言語}として有名です。確かに小学生にも使えるとしてかつて話題になったこともありますし、現に小学生のための本にLogoが紹介されているのを多く見出すことができます。しかし、それはLogoの一面しか見ていないと私には思えます。
Logoの特色として、\\
0) タートルを用いて、手書きと同じ発想でグラフィクスを制御できる。\\
1) 型宣言が不要。\\
2) 再帰的定義が可能。\\
3) 関数型言語である。\\
を挙げることができます。このうちの0)があまりに大きく取り上げられたために、「小学生にも使える」ことが強調され、あたかも「小学生しか使えない」という見られかたをすることに一石を投じたい。この章を書く動機はそのようなところにあります。
Fortranというプログラム言語があります。昔は計算機に計算をさせるときに機械語を使ってプログラムしていたのですが、これがなかなか厄介でした。そこで、人間の言葉に近い言語を使って算法を記述しておいて、その言語を機械語に翻訳することを計算機にやらせて、その結果をまた計算機にやらせればいいじゃないかという発明がありました。その「人間の言葉に近い言語」として当時考えられたのが、Fortranです。\index{ふぉーとらん@Fortran}しかし、コンピュータが普及するにつれて利用者の裾野が広がり、専門家と一般の人の区別が利用者の中に生まれるようになります。効率とか速度とか処理する規模の点では劣るかも知れないが、専門的な知識とかがなくとも、初心者にも扱える言語として、Basicが作られました。\index{べーしっく@Basic}
科学技術計算のための言語、FortranとBasicの系譜の一方で、人工知能の研究には、Lispという言語\index{りすふ@Lisp}があります。Logoはこれを親として生まれた言語で、初心者にも扱いやすい工夫がなされています。図式的にまとめれば、\vspace{0.75zh}\\ \hspace*{1zw}\hfil
\begin{tabular}{|r|ll|} \hline
\
& 一般の人 & 専門家 \\ \hline
科学技術計算& Basic &
Fortran \\
人工知能& Logo &
Lisp \\ \hline
\end{tabular}\hfil \vspace{0.75zh}\\
と書けるでしょう。その意味では、Logo は人工知能を作るための言語です。しかし、\index{しんこうちのうけんこ@人工知能言語}前の章で紹介したようにパパートは発想を逆転して、コンピュータを教えること考え、その教えを体現するオブジェクトとしてタートル(亀)\index{たーとる@タートル}\index{かめ@亀}を組み入れたのです。プラスチックでできた本当に床の上を動くものも作られています。
%\end{document}
\section{ロゴライターを使う}
Logoの標準としては、Logo Writer \index{ろこらいた@Logo Writer}を挙げるべきでしょう。これのWindows版である、Logo Writer for Windows ver.1.01 の扱いかたを中心に述べていきます。
Windows95 を立ち上げると、普通は左下にスタートボタンが現れます。それをクリックする、あるいは、[Ctrl]を押しながら[Esc]を押すと図1のような画面になります。
%\end{document}
%\begin{center}
\begin{figure}
\begin{center}
\bmpfile(9cm,6.75cm){startbot.bmp}
\end{center}
\caption{起動させるには}
\end{figure}
\begin{figure}
\begin{center}
\bmpfile(9cm,6.75cm){startup.bmp}
\end{center}
\caption{起動してしばらくたつと}
\end{figure}
%\end{center}
%\end{document}
このなかから、「プログラム{\tt
(\underline{P})}」を選ぶと、さらに、「ロゴライターWin」を含むメニューがでてきますから、それを選びます。もちろん必要に応じてショットカット・キーを作ればより容易に起動させることができます。
起動してしばらくたつと、図2のような画面になります。これは画面のピクセルが$1024\times768$のものですが、$800\times600$だとやや違ったものになります。ともあれどちらの場合も「コマンドセンター」\index{こまんとせんた@コマンドセンター}のカーソルが点滅しているはずです。
%\newpage
試しに、「{\sf forward 100}」と打ってリターンキーを押してみましょう。 亀さんが前へ100歩進みました。亀の尻っぽにはペンがついていて線を進みながら書いていきます。では次に、「{\tt right 90}」と打ってみましょう。亀が右へ90度向きを変えたはずです。このように、コマンドセンターを通じて亀に命令をすることができます。さて、ついでですから正方形を書かせてみましょう。「カーソルキー[↑]を使って元に戻ってリターンキーを押す。」これで、繰り返させることができますが、繰り返しを顕著にあらわせる命令があります。
「{\tt repeat 回数 [繰り返しの内容]}」です。\index{くりかえし@繰り返し}この場合いきなり、
\begin{center}
\begin{verbatim}
repeat 4 [ forward 100 right 90 ]
\end{verbatim}
\end{center}
とすれば、正方形が得られます。しかしいったん書いてしまったのですから、初めの状態に戻してからこれをしましょう。\index{せいほうけい@正方形}「{\tt cg}」とすると?ほら元に戻りましたね。
\vspace{2zh}\\
%\begin{itembox}{Terrapin Logo (Pc Logo)のための補足}
\Trl{Logo Writer との違いとしては、上の{\tt cg}(clear graphicsの略か)が、{\tt cs}(clear screen)となっていたり画面の入出力の命令に若干の違いがあります。
\index{てらひんろこ@Terrapin Logo}\index{ひしろこ@Pc Logo}
日本語もときどき文字化けがおこることがありますが、Options の Expert Modeで日本語用のフォントを選び入力したときと同じフォントであれば漢字を出すこともできます。
しかし、改行を「~]」と解釈してしまうので、上の「[繰り返しの内容]」は1行にかかないとなりません。
%\end{itembox}
}
ところで、このような正方形をかくことが多くなりそうでしたら{\small (まさかね)}、単に「{\tt Sikaku}」などと打って正方形をかかせることにしましょう。
Logoには、right とか forward とかのプリミティブ\index{ふりみちふ@プリミティブ}という組み込まれた命令がありますが、「うらのページ」に一定の書式で書き込むことによって命令を利用者が定義することができます。いま亀が動いたのが「おもてのページ」\index{うらのへし@裏のページ|see{ページ}} \index{おもてのへし@表のページ|see{ページ}} \index{へし@ページ}なのですが、裏という見えないところに仕掛けを作っておくのです。
図2の画面では右上に「うらがわ」という部分がありますがそれをクリックします。
すると「うらがわ」のカーソルが点滅を始めます。
解像度の低い画面の場合は「うらがわ」が出ていません。この場合は、画面の上にあるツールボックスのうち、ページを裏返しにするアイコン
\index{うらかえしあいこん@裏返しアイコン}
\begin{minipage}{2zw}
\bmpfile(1.8zw,1.8zw){uragaesi.bmp}
\end{minipage}
をクリックします。
あとは、次のような内容を「うらがわ」に書き込みます。
\begin{itembox}{うらがわに書く内容}
\begin{verbatim}
to Sikaku
repeat 4
[ forward 100
right 90
]
end
\end{verbatim}
\end{itembox}
このように、to と end の間に定義したい命令のなまえと命令によって行なわれる内容とを書いておく。これが書式です。あとは自由ですが、
空白や改行を適当にいれてどこの部分が繰り返されるか示すようにするとよいでしょう。そして、コマンドセンター、あるいは、裏返しアイコンをクリックしてコマンドセンターに戻ります。さあ、この命令が使えるかどうか試してみましょう。{\tt forward 100}と同じ要領で、{\tt
Sikaku}と打ってみて下さい。なお、初めの大文字は小文字であってもかまいませんが、全角文字ではなく半角文字である必要があります。
この本では、プリミティブと区別するために、「うらがわ」で定義されているものの名の初めの1字を大文字にします。
\Toi{一辺が100の正三角形をかく命令
\verb+ Sankaku + を作ってください。}
\label{toi01}
\begin{center}
\bmpfile(9cm,6.75cm){Sikaku.bmp}\\
\end{center}
%\thechapter
%\newpage
%\vspace{0.5zh}\\
\Toi{このままでは一筆書きのできるものしか書けそうにありませんね。
亀の尻っぽのペンを{\tt penup }で上げさせることができます。反対にペンを下ろさせるのは、{\tt pendown}、消しゴムを持たせるのは{\tt penerase}です。
\index{へん@ペン}\\
さて、カタカナでも英文字でも好きな文字を何かひとつ選んでください。その文字を亀に書かせる命令を作ってみましょう。\label{toi02}}
\section{パラメータ}
{\tt forward}という命令の次に記す数は亀の歩く歩数になっています。これをかえると {\tt Sikaku}の書く正方形の一辺の大きさを変えることができます。しかし、いちいちページを裏返しているのは面倒です。そこで、歩数を{\tt :x}と置いて次のように定義します。こうすれば、{\tt Sikaku 100} で一辺が100の、{\tt Sikaku 120}で一辺が120の正方形をかかせることができます。このように命令の名の直後につけて指定できる命令の仕様を「パラメータ」\index{はらめた@パラメータ}あるいは「引数」\index{ひきすう@引数}と言います。
\begin{itembox}{辺の長さを指定できる正方形}
\begin{verbatim}
to Sikaku :x
repeat 4
[ forward :x
right 90
]
end
\end{verbatim}
\end{itembox}
パラメータは、いくつでも指定できます。「うらがわ」での定義の際に、
\begin{verbatim}
to Chouhoukei :Tate
:Yoko
\end{verbatim}
\index{ちょうほうけい@長方形}などと書けばいいのです。ただし、それぞれのパラメータの名の前に、「:」が記されていることに注意して下さい。これがないと「Tate」という命令と解釈してしまうからです。
データを記憶させておくような文字の使い方を変数\index{へんすう@変数}といいます。パラメータも変数の一種です。変数の名は初めに数字を使うことができません。そして、変数の名の直前に「:」をつけることによって、その変数へ記憶されたデータを表します。
また、命令の名も初めに数字を使うことはできません。数字はやっぱり数として素直に使いたいからです。四則演算\index{しそくえんさん@四則演算}の記号({\tt +,-,*,/})も普通に使えます。累乗は「^」が使えます。三角関数などの数学の初等関数\index{しよとうかんすう@初等関数}の結果を表すものもプリミティブにあります。
実は、プリミティブとして決められているものは必要最小限ではなく、他のものを使って定義されるものでも利用者の便宜を考えてプリミティブとなっているものがあります。例えば、亀を左の方へ向きを変えさせるのは、{\tt left}ですが、それと同じ意味の
{\tt Left\_} を作ってみましょう\footnote{{\rm -- }は中置演算子で符号を変える演算子としては用いません。左右に引数が必要です。}。\index{ちゅうちえんざんし@中置演算子}\index{えんさんし@演算子}これから、練習のためにプリミティブのまねをする命令を作ることがありますが、そのようなものの名前の最後
\begin{tabular}{lllr}
プリミティブ&意味&用例&出力される値\\
\hline
{\tt abs}&絶対値&{\tt abs -20}&20\\[2mm]
{\tt int}&
$\left\{
\begin{minipage}{8zw}
絶対値の\vspace{-0.5zh}小数部分の切り捨て
\end{minipage}
\right\}$&{\tt int -3.14}&-3\\[2mm]
{\tt remainder}&あまり&{\tt remainder 13 5}&2\\
{\tt sqrt}&平方根&{\tt sqrt 49}&7\\
{\tt sin}&三角関数の正弦&{\tt sin 30}&0.5\\
{\tt cos}&三角関数の余弦&{\tt cos 60}&0.5\\
{\tt tan}&三角関数の正接&{\tt tan 45}&1\\
{\tt arctan}&正接の逆関数&{\tt arctan -1}&-45\\
{\tt ln}&自然対数&{\tt ln 1}&0\\
{\tt exp}&自然対数の逆関数&{\tt exp 1}&2.7183\\
{\tt hexa}&16進数表示&{\tt hexa 31}&1f\\
{\tt random}&パラメータ種の乱数&{\tt random 10}&{\footnotesize
(10未満の整数)}
\end{tabular} \vspace{1.5zh}
は下線「 \verb+_+ 」を付けて定義が重なることを防ぐことにします。
\vspace{1.5zh}
\begin{itembox}{プリミティブ left は作れる}
\begin{verbatim}
to Left_ :t
right 0 - :t
end
\end{verbatim}
\end{itembox} \vspace{0.5zh}
\\
\Toi{\label{toi03}{\tt back } は、指定したピクセルだけ亀を後ろへ移動させます。
{\tt forward } を用いて {\tt Back\_ }を作ってみてください。}
\vspace{1.5zh}\\
\Trl{
\index{ひしろこ@Pc Logo}\index{てらひんろこ@Terrapin
Logo}
%\begin{itembox}{PC Logoでの「うらがわ」}
PC Logo では、うらがわという表現を使わずに、ファイルに書き込んでそれをロードするという手続きになります。メニューバーの一番左の File メニューから New を選択してエディタを起動します。このエディタは拡張子が、.lgo のテキストファイルを生成するものですから他のエディタでも作れます。こうして作ったものを、再び
File メニューの Load を選べば、そのファイルで定義した命令が使えるようになります。\\
これの内容を修正するには、File メニューの Edit を選んで当該のファイルを呼び出して修正してから再び Load する必要があります。}
%Save をするとせっかく区別した大文字小文字が全部大文字に変換されたものが
%上書きされるので、これはしない方がよいでしょう。
%\end{itembox}
\section{関数型言語と画面への書き込み}
Logo の特色として、「3) 関数型言語である。」と述べました。例えば、Basic, Fortran などは write(書け)とか、do(やれ)とかの命令形で手続きを記述するので、「手続き型」、Prolog では、
\begin{verbatim}
human( socrates
) ソクラテスは人間である。
yes リョウカイ
human( X ) 人間であるのは何か?
X = socrates そくらてすナリ
\end{verbatim}
と状態を平叙文で記述するのを基礎とするので、論理型と言われます。これらに対してLogo や Lisp は関数の働きを記述することによってプログラミングを行ないます。Pascal などでは、副譜を出力のあるかないかで、function と procedure と区別しますが、Logo ではどちらも to と end ではさむという同じ書式で定義します。つまり区別しないのです。さらに、C や Pascal ではどこが主譜(main)かを示す必要がありますが、Logoには主譜と副譜の区別さえありません。うらのページにいろいろと関数を定義しておいて、必要なときに適当な関数を呼び出せばよいのです。{\small (ここまで出てきた言語について知らない人は単なる呪文だと思って無視してくださいネ。)}
関数というのは、ご存知のように出力があります。2倍して3をたす関数を $F$ とすると、5を入力としたとき、$$F(5)=2\times5+3=13$$なので出力は13です。$F(5)$の値は13などとも言います。このような関数の値(出力)とする命令は、{\tt output}です。この例にした関数の場合つぎのように記述されます。
\begin{verbatim}
to F :x
output 2 * :x + 3
end
\end{verbatim}
こう定義しておいて、{\tt F 5} とかくと、「13をどうするのかわかりません」。わかりませんとは御挨拶ですが、ともあれこの2倍して3をたすという操作はしたようです。
関数記号 $F(5)$ というのは、その結果13を示している。つまり、13に置き換えられるわけですから、{\tt
F 5 }とかくのは、いきなり「13」とかくことと同じ。ですから、このような返事になるのです。
では、\verb+ F sqrt 16 +と書くとどうでしょう。
\begin{enumerate}
\item \verb+ F + というのは関数の名前ですからその定義を探します。1つのパラメータがあるはずです。
\item 次の \verb+ sqrt +も1つのパラメータが必要ですから、これのみではなく、\verb+sqrt 16 +全体が \verb+F+のパラメータをあらわすものと見なします。つまり、\verb+ F ( sqrt 16 ) +と解釈します。
\item \verb+( sqrt 16 ) +の部分はプリミティブです。計算が実行されて、$\sqrt{16}=4$。そこでこの部分が計算結果に置き換わります。つまり、\verb+ F 4 +と解釈されます。
\item そこで関数\verb+ F +の定義に従った計算が実行できて、$
2 \times 4 + 3 = 11 $
\item 結果は単に 11 とかいた場合と同じになります。
\end{enumerate}\vspace*{1zh}
もう一つ例を出しておきます。具体的な定義は後に述べることになりますが、2つの自然数の最大公約数を出力する\verb+
GCM :x :y +があるとします。その時、\verb+GCM
GCM 18 24 27 +の値はどうなるでしょう。
その真下に書き換わった結果を記すことにして経過をあらわすと次のようになります。
\\[1.5zh]
\begin{enumerate}
\item \verb+GCM GCM 18 24 27 +
\item \verb+GCM (GCM 18 24) 27 + (\verb+GCM +は引数が2つあります。)
\item \verb+GCM 6 27 +
\item \verb+
3+ \\[1.5zh]
\end{enumerate}
このように関数の、その値に置き換わるという機能で計算の実行が記述されるのです。
Logoには、function と procedure の区別がないと言いましたが、procedure に当たるものを出力のない関数とみるのです。例えば、\verb+forward :x +というのは、\verb+:x + の値に応じて亀にある動作をさせるという副作用がありますが、関数記号がおきかわるべき出力がありません。これまでに作った、Back\_ とか、Sikaku、Sankakuなども算譜に output を含んでいないことからわかるように、実は出力のない関数だったのです\footnote{もっともロゴライタのマニュアルにはレポータとコマンドという言葉が書いてあります。}。
このように関数の値を計算する途中にいろいろな副作用を起こすのもありです。そして、副作用のみで、実行されたら置き換るべき値のない、強いて言えば長さ0文字列が出力の特殊な関数もあるのです。画面にいろいろな情報を書いたり\index{かめんへのしゅつりょく@画面への出力}
するものがそれです。差し当たり必要なので紹介しておきましょう。
\begin{center}
{\tt \small
\begin{tabular}{|l|ll|}\hline
改行 &ページ&
\begin{minipage}{4zw}
コマンド\vspace{-0.5zh}\\センター
\end{minipage}\\
\hline
あり&print&show\\
なし&insert&type\\
\hline
\end{tabular}
} %end of \tt
\index{insert@insert}
\end{center}
これらを使ったサンプルを作っておきます。
\begin{itembox}{字はどこに出るのでしょう}
\begin{verbatim}
to Disp_Ex
print "はいこんにちは!ページに
insert "書いてます。
print "改行がどこかみてくださいね。
print "突然ですが。3つ数えて下さい。
repeat 3 [ insert "・ wait 60 ]
show "はいどうですか?
type "今度は
type "コマンドセンタにでました。
type "改行の位置も見てくださいね。
end
\end{verbatim}
\end{itembox}
{\tt print} などの後の言葉に引用符「{\tt "}」が付いていますが、これは「書いてみます」という名の関数の値を書くのではなく、「書いてみます」という文字そのものを出せという意味です。つまり、前に何もないと関数をあらわし、\verb+: + があると、その名の変数の値をあらわし、\verb+" +があるとデータそのものをあらわすのです。
\section{条件分岐}
上の例、\verb+ Disp_Ex + は、「コマンドセンター−>おもて」の状態であることを前提にしています。Logo Writer
ではどちらのページへ出力するかの違いがあります。
「うらがわ」がターゲットになっているときには、「おもてのページ」をクリック
するか、{\tt flip
}\index{flip@flip}と命令するかしてください。表か裏かを調べるには、{\tt front?}
という命令を用います。ページ\index{へし@ページ}に書いた文字を消すには {\tt
cleartext }\index{cleartext@cleartext} です。
条件によって行なったり行なわなかったりするには、
\index{しょうけんふんき@条件分岐}
%\begin{center}
\verb+ if 条件 [ 実行するべきコマンド ] +
%\end{verbatim}
%\end{center}
によります。例えば、おもてのページにある文字を全部消すコマンド \verb+ Ct_Front+を作ってみましょう。
\begin{center}
\begin{verbatim}
to Ct_Front
if not front? [flip]
cleartext
end
\end{verbatim}
\end{center}
{\tt not } はその後の条件の否定です。この場合、{\tt front? } はページが表の
とき真になりますが、{\tt not
front? } はその逆でページが表のときに偽になります。
つまり、ページが裏のときに真になります。
\index{しんき @真偽}
%\begin{center}
\verb+if not front? [flip]+
という行は、裏のときだけ、{\tt flip }
を実行せよという意味です。こうしておけば
次の行を実行するときにはいつでもページが表となってますね。そうしておいてから、
{\tt cleartext } をするのですから、目的の機能が得られるわけです。\\
\Toi{%\bf (問3−1)}
\label{toi04}上のプログラム例 \verb+ Disp+\_\verb+Ex + をページを表にしてから実行しなくてもいいように改良してください。
}
\section{Main はいらない}
普通プログラムには、主譜と副譜の区別
\index{しゅふ@主譜}\index{ふくふ@副譜}\index{さんふ@算譜}があるものです。そうしておかないとどれをはじめに実行するかわからないからです。Logo では複数の算譜をひとつのファイルに書くことができますし、そのうちのどれが主譜であっても構いません。コマンドセンターから、あるいは、他の算譜から呼び出されたものが実行されます。\index{たまことにわとり@卵とニワトリ}
かなり馬鹿馬鹿しい例ですが、次のものはどれが
Main だかわからない例です。
\begin{itembox}{どっちが先ですか?}
\begin{center}
{\small
\begin{verbatim}
to Tamago
print "わたしは卵です。
print "殻を破ってひよこがでて、
print "おおきくなると何になるかな?
print "
wait 240
Niwatori
end
to Niwatori
print "わたしは、にわとりです。
print "わたしだって、恋にオチテ、
print "愛の巣に卵を産みます。うーん
wait 240
print "ポットン!
Tamago
end
\end{verbatim}
}%end of \small
\end{center}
\end{itembox}
ちなみにこれは放っておくと際限なく繰り返しますから、適当なところで止めてください。\index{きょうせいしゅうりょう@強制終了}止め方は「ツール」を選べばそこに「ストップ」がありますし、[Ctrl]+[Break]でも止めることができます。\index{きょうせいしゅうりょう@強制終了}
もっとも、どれでもいいと言われてもどれを呼び出すか忘れてしまうと困るので、私はファイル名をはじめに呼び出す関数の名前にしています。また、Logo Writer では startup という命令が定義されていれば、そのファイル(ページ)を開いた時点で自動的に startup の実行が始まります。\index{すたとあふ@スタートアップ}
\Trl{animal.lgo などの自動実行されるファイルをエディタでみてみましょう。
そうです。ファイルの最後に初めに実行するべき命令が呼ばれていますね。
実行を途中で止める強制終了は、赤信号のアイコンをあるボタンを押します。
文字化けが起こる場合があるので、漢字やカタカナをひらがなに直したりして
対応します。}
\begin{center}
\bmpfile(9cm,6.75cm){tamago_w.bmp}\\
\begin{minipage}{35zw}
\end{minipage}
\bmpfile(9cm,6.75cm){tamago_t.bmp}\\
\end{center}
\begin{itembox}{日本語のプリミティブ}
小学生にも扱えるソフトとして、ロゴライターなどの日本語のプリミティブが使える
という特徴は、大いに賞賛するべきだと思います。
%{\small
\begin{center}
{\bf 日本語のプリミティブの例}\\[0.5zh]
\begin{tabular}{l|r} \hline
日本語 & 英語 \\ \hline
かけ & \verb+print+ \\
さいしょ & \verb+first+
\\
たのむ & \verb+ask+ \\
てじゅんは & \verb+to+ \\
\hline
\end{tabular}
\vspace*{1zh}\\
\end{center}
%}
念のいったことに、例えば「書け」でも「かけ」でもいいのです。
小学生も高学年になれば、ローマ
字を知っていますし、キーボードでの文字入力もローマ字入力の方が位置を覚えるこ
とが少なくて済みます。
でも、小学生にとっては\verb+ print
+ という字の並びは無意味綴り。
覚えるときにはかなり負担となってしまいます。
でも、この本では、大学生とちょっと背伸びをした高校生と読者の
皆さんを想定しました。データや変数名だけでなく、プリミティブまでが
日本語だと、地の文と区別が付きにくいとか、キーストロークが多くなる
とかちょっと損なことがあるだろうと思えるからです。\label{jpn}
\end{itembox}