最近の読書とprolog

姪っ子の家族が遊びに来た。小学生の長女は、ニンテンドーのswitchってゲーム機持参。2歳に満たない長男は、まだはにかみ屋さん。おかあさんにしっかり、まとわり付いていた。そのうちに、ipadを見つけ出し、勝手にディズニーのアニメを見始めた。こんな小さい子でも、当たり前のように操っている。末恐ろしか。おねーちゃんと言えば、炬燵に潜り込んで、エビぞりになりながらも、ゲーム機を手放さない。これが、当たり前の世界なんですかねぇ。

raspberry Pi 400

Your complete personal computer, built into a compact keyboard

こんなのが、昔の日本にも有ったよ。FM-7 だっけ? いや、海の向こうにもあったな。流行は繰り返す。このキットで、100ドルですってさ。

4G積んだラズパイらしいから、512MぐらいはRAM-DISKに割り当てて、普段はそこを仕事場にする。そうすれば、壊れやすいメディアの延命が出来るな。

仕事って、オイラーの場合はソースをガンガンとコンパイルしたりする事です。デフォで開発環境が入っているのだろうか? 教育界ご推薦って事で、用意されてる事を願うぞ。

5G

岩波新書で「5G」なんて本が有ったので、読んでみた。流行りですからね。高速ってのの謳い文句に、2時間の映画が3秒でDL出来ます、ってのがある。今の4Gだと5分もかかる。魅力ですなあ。

次なる魅力は、低遅延性を生かして、遠隔手術が可能になります、ってのがある。米国の名医に、遠隔手術してもらえるな。

次なる魅了は、同時接続性。あちこちにセンサーを置いて、色々なものをセンシング出来るぞ。

色々なセンサーって何よ? 例えば雨が降ってきたかセンシング。別に雨だけじゃなくても良い。猫のマーキングで、片足あげておしっこ、その仕草は犬だろう。これを使えば、猫の行動範囲が手に取るように知れる。センサーをビデオカメラに変えれば、怪しい人がうろついただけで、警報をだせるな。サツ大助かり。

名医への手術依頼は、物理的に無理。5Gになって遅延が数十ミリセカンドから、1ミリセカンドぐらいになるとか。でも、光ファイバー網で海の向こうまでは、最低でも20ミリセカンドかかってしまう。光ファイバーを伝わる光は20万キロ/秒ぐらいになっちゃうからね。それに、如何ともしがたい距離が有るからね。

光ファイバー内を伝わる光のスピードは、真空中の光のスピードである30万Km/秒を大幅に下回る。それは何故? チコちゃんの材料に丁度よさそう。60年以上前は5歳でしたって投稿しようか。

答えは、光は電波だからーー。同軸ケーブルの短縮率は、大体0.67とかそれぐらい。媒体の誘電率で決まるスピードになる。それを分かり易いように短縮率に変換してる。媒体内のスピード比率だ。電波は、内部で抵抗を受けるため、フルスピードで走れないのさ。 アインシュタインの理論によれば、短縮率は1以上になる事は無い。 じゃ、電波と光の境目は? 電波法ってのがあって、それによると3THzまでが電波として、規制を受けるはめになっている。まあ、そういうものよって言う、無駄知識。

高速DLは、28G帯のゆったりしたバンドを使って実現出来る。まだそのバンドは利用が整っていない。なんでも、直進性が高く、余り電波が届かない。よって多数の基地局が必要。まじで、交通信号機の上に基地局を置く事が検討されてるとか。

面白いニュースが飛び込んできた。去年の大水害を未然に防ぐ為、河川の水位の監視を強化しましょう。でも、ちゃんとした水位計は1箇所設置するのに1000万円もかかるとか。それじゃ、おいそれと設置出来ない。簡易版のやつでも100万円はすると言う。これとて貧乏な地方の自治体では設置が難しい。

そこで、トラ伎やインターフェースの読者がハッカー魂を発揮すべく立ち上がった。まずはセンサーの問題。電波は水に弱い。電波発信機が水没すると電波は届かなくなる。だったら、電波が飛んでる(水没してない)、電波が途絶えた(水没してる)で、水位がどこまで来てるか分かるはず。竿にでも20cm間隔ぐらいで、電波発信機を取り付け、その竿を川に立てかけておけばいいんじゃない。簡易は発振器なら、1個数千円、電池は1年持つやつを使う。これで、一か所10万円ぐらいで出来るんじゃない。

逆転の発想、かつ5Gの何処でもIoTの見事な応用だな。件の本は一般向けなんで、余り技術的な事には触れられていない。この場合は、発振器事にIPアドレスが必要。高価なIPアドレスが湯水のごとく必要。そんな事もあろうかと、IPv6規格が用意されてる。これなら使いたい放題だぞ。それと、低速通信でパワーを抑える通信規格も発達してきたしね。

科学探偵 vs. 暴走するAI

5Gの本を取り上げたので、秋深し隣は何をする人ぞ宜しく、最近読んだ本の事を少し書いてみる。

表題の本、選んだ理由は、お子様向けで、活字が大きかったから(と言う情けない理由です)。 面白そうと思って借りてきても、いざ読みだしてみると、字が細かかったり、フォントが嫌い(細い)だったりして、投げ出してしまう事が多々あります。

それじゃいかんと言う事で、工夫してる事として、本をパラレルに読むと言う手法。根を詰めて読むと、眼への負荷(コンピュータ用語で言うと、ロード・アベレージ)が高まらないように、20分で、次の本へスイッチします。

こうして、2週間の借用期間中に、なんとかタスクを完了させるようにしてます。時分割な読書習慣ですな。時たま、面白くなって、タイムスライスを延長させたり、優先度を上げて無理しちゃう事があるので、自戒しましょう。>オイラー。 大体、3つぐらいのプロセスを投入してますよ。それ以上だと、以前の環境が復帰出来なくなってしまいますからね(要するに、前のあらすじを忘れてしまう)。

さて、この本だけど、読んだのは前編。後編が有るかと思ったら、12月に刊行されるらしい。 未来の世界。某IT企業が、ある都市をIT特区として実験を始める。全住民にもれなくipadもどきを配布。スマホなんて、あんな小さい画面は年寄りに無理ですから(激同意)。

その端末の中には、擬人化した執事が住む。色々とアドバイスしてくれる。ヘッドアップディスプレイも配布されてて、ハワイ県へ行った気分にもなれる。いい事ずくめ。 ああ、こうやって書いていくとネタバレになって訴えられるかも知れないのでCut。

有名なAIの問題が出て来る。2又に分かれた線路。その先には5人のグループが居る。もう一方の線路には1人が居る。トロッコ列車が暴走した。あなたは、どちらの線路に列車を誘導する?

AIからの答えは1人が犠牲になれば良い。じゃ、その一人がスーパードクターで、100人の人を 助けられるとしたら? 答えはコロリと変わって、5人が犠牲になればよい。小学生、考えろよ。

ひょんな事から、アレクサが暴走する。原因はさっぱり分からん。ドルフィン・アタックが行われていた。答えを書いてはみたけど、訴訟が恐いので、抹消しとくね。

ドローンに追われるはめになる。どうやって振り切る? 都会なら、ビルの谷間に逃げ込め。理由はやはり省略しとくね。

。端末の電源が切れないように仕掛けされた。どうやって防御する? スノーデン宜しく、冷蔵庫に突っ込んじゃえ、何故かは、5G本の所に書いたのがヒント。

その他、盛りだくさん。早く次が出ないかな。

電柱マニア

マツコ・デラックスのあの番組に登場してもよさそう。まて、タモリの暗渠好きみたいに、一般受けはしないから、まあ無理だな。そんなニッチな企画を通して、オーム社に本を作らせてしまうって、著者さんの熱意? それとも、藁をも掴みたい心境の出版社の熱意? どっちでもいいけど、読者は楽しむだけ。

最近の読書傾向は、ジャンルを選ばないに尽きます。この間は、危険物取扱者の本なんてのを読んだよ。消防法の規定では、危険物の範囲を個体と液体に限っているとか。気体のプロパンガスとは、別物なのね。知らんかった。で、危険物は、その種類によって6つに分類される。 どの類でも扱える資格が、甲種。類が指定されるのは乙種。扱える量とかが限定される丙種があるとそうな。甲乙丙って、いかにも古臭いな。

よくタンクローリーに、危険物、4類、石油とか書いてあるけど、それは、危険物取扱の法律によるもだった。

話が逸れた。まだ読みだしたばかりなんで、余り書けないけど、著者さんは、電柱に必ず取り付けられている碍子のマニアでもあるそうだ。そう言えば、タモリさんも碍子をみてうっとりしてたね。あれ、ブラタモリの有田焼の回だったかな。

そうそう、来る 11月10日は、無電柱の日らしいですよ。都会では、防災の邪魔になるとかで、どんどん撤去されてるようだね。田舎では、まだまだ健在。カラスとかの格好の羽休め場になってる。オイラーも、上をむういて、あーるこうをやってみつかな。プチ電柱マニアになった積りでね。

prologに慣れる

(D.Warrenの抽象Prolog命令セット, WAM)

慣れるとか言いながら、最初にこんなのを持って来るとは何事ぞ。これ、schemeを実現する為にSECDマシンってのが使われるんだけど、それのprolog版らしい。

まずはfactだな。こんな定義らしい。

fa(0,1) .
fa(N,X) :- N1 is N - 1, fa(N1,X1), X is X1 * N .

| ?- fa(10, Result).

Result = 3628800 ?

yes

lisp系のfactだと引数が一つなんだけど、prologでは奇異な事に2つある。最後の引数が結果を保持するように配置するのが習慣のようだ。

looop(0).
looop(X) :- print(X), nl, X1 is X - 1, looop(X1).

| ?- looop(3).
3
2
1

true ?

yes

trueって出て来た時、RETURNで終了する事。; なんてやって次の答えを求めようとすると、マイナスの彼方へ向かって行っちゃって、どうもにも、止まらない(と、山本リンダ風。歳がばれるな)。どうせ歳がバレるなら、頭部とボディーを接続してる、:- を、メダカ と呼んであげましょう。

かの昔、政府の肝入りで、人工知能を研究してたらしい。ICOTとか言う団体を作って、コンピューターメーカーの頭脳明晰な人がそこに出向。prologを研究してたそうな。そこでの :- の隠語がメダカだったそうな。lisp系のカッコ、コッカに通じるものがあるな。

Prologプログラミング: 記号処理 も、面白いから見ておけ。

prologの特徴として、逆演算が出来るってのがある。結果を与えれば、その結果を作り出した入力が分かるって事。本当か確認してみる。

| ?- fa(N, 120).
uncaught exception: error(instantiation_error,(is)/2)

怒られた。そんな逆演算出来ないって。

sq(X,Out) :- Out is X^2.

| ?- sq(5,X).

X = 25

yes
| ?- sq(In, 25).
uncaught exception: error(instantiation_error,(is)/2)

is が問題。isは右式を評価して、その結果を左式に代入する。これ、本当は = って書きたい所だけど、= には、別の大事な機能(パターンマッチング)が割り当てられている。

で、結果が25になる式は幾らでもある(10+15, 50/2, etc,etc)。で、怒ってきたわけだ。

じゃ、逆演算の例は? 一番有名なやつに、appendってのがある、2つのリストを結合する関数。7つの言語でも、驚きを持って取り上げられていた。定義はこうだ(システムが用意してるのと重ならない名前にしてる)。

appd([],X,X).
appd([A|X],Y,[A|Z]):- appd(X,Y,Z).

scheme語に翻訳すると、下記のようになる。

(define (append x y)
  (if (null? x)
     y
     (cons (car x) (append (cdr x) y))))

prolog語で、[A|X] ってのは、car、cdrに相当するのね。この記法はhaskellとかにも採用されてたっけ? 3日経つとすぐに忘れる脳。同じ再帰でも、prolog流の書き方になってる。

| ?- appd([i, like], [the, prolog], Res).

Res = [i,like,the,prolog]

リストは鍵カッコで括ったもの。要素の区切りには、残念ながら,が必要(lispが特殊なんだな)。 これは、まあ、そんな物と思ってくれ。面白のは、ここからだ(と、7つの言語の口調です)。

| ?- appd(A, B, [i, love, scheme]).

A = []
B = [i,love,scheme] ? a

A = [i]
B = [love,scheme]

A = [i,love]
B = [scheme]

A = [i,love,scheme]
B = []

こんな入力の組み合わせでも、出力と同じものを生成できるとな。 最初の結果が出た所で、;を入力すれば、1組づつ結果が出て来る。aってやれば、allな結果を一気に出してくれる。

prologで遊ぶ(いや、遊ばれる)

次なる本は、署名がうろ覚えになっちゃったけど確か、お父さんお母さんにも分かる算数 みたいなやつ。位取りの秘密とか、方程式を使わない、つるかめ算とか旅人算とか。比例を使って、木の高さを測量してみましょうとか。バラエティー豊である。

ピタゴラスの3角形で、直角を作りましょうなんてのもあった。3辺の長さがA,B,Cの三角形があります。C辺を斜辺、A辺よりB辺が大きいとして、ある比率を満たせば、A辺とB辺の角度が直角になりますってやつだ。

これ面白そうだな。prologで表現して、自動でそういう組み合わせを求められないか。 小学生には、ちょっと高度になる(かも知れない)けど、ドンピシャで ピタゴラスの定理 だな。やってみるか。おっと、その前にnprologの作者さんと、ちとやり取りをしたので書いておく。

> nprologのソースを少しgdbしました。atomは、単にmallocしてるんですね。
> そうすると、
> extern int variant[VARIANTSIZE];
> の用途は何なんでしょう?

これはα変換した変数です。Prologの場合、節に含まれるX,Yなどの変数は再帰した
場合に備えて再帰ごとに別な変数に置換しています。これが思いのほか大量に作られます。
Prologの場合には変数Xが変数Aにunifyしてさらに変数Bにunifyしてなどということが
あります。このリンクを高速にたどるために頭をひねって思いついたのがそのvariant
という配列を使う方法です。

まだまだ、話に付いて行けないな。大体prologを真面目にやるなんて初めての事。全くの無知です。それだけ、覚える楽しみが有るってものです。どうです、このポジティブ思考。

> ?- p(A,B,C) :- A < B, A^2 + B^2 == C^2.
> no
> ?- p(3,4,5).
> Existence error  p(3,4,5)

assertを使ってください。
assert(( p(A,B,C) :- A < B, A^2 + B^2 == C^2)).
のようにして定義します。エディタを使って

 p(A,B,C) :- A < B, A^2 + B^2 == C^2.

を書いておいてこれをconsultするのでもOKです。
['foo.pl'].  とすれば consult('foo.pl')と同じ扱いになります。省略記法です。

ピタゴラを書いて、実行しようとしたらエラー(noで先に気づけよ)。実行するまで分からないって、勘が鈍いな。

replの上から登録するには、assertを使え。主張とか言明って意味だな。データベースみたいなのが有って、そこに強引に登録出来るんだな。普通は、ファイルに書いておいて、それを読み込ませるのか。

だとすると、replとeditorが一体になった環境が欲しい。そんなの前につかったじゃん。emacsのprolog-mode。これをnplでも使えるようにすればいいのか。ggすると、 prolog-systemって変数に、使うprologシステムを登録しておくようだ。

Prolog interpreter/compiler used.
The value of this variable is nil or a symbol.
If it is a symbol, it determines default values of other configuration
variables with respect to properties of the specified Prolog
interpreter/compiler.

Currently recognized symbol values are:
eclipse - Eclipse Prolog
mercury - Mercury
sicstus - SICStus Prolog
swi     - SWI Prolog
gnu     - GNU Prolog

ふーん、今の所prolog.elの作者さんが認めたものしか使えないのね。ならば、nplをgprologと偽ってしまえ。prolog詐欺の実践です。いや、ハッキングです。ハッカーと言うと悪い人ってマスコミに植え付けられてしまってるけど、そうじゃないからね。心ある人が、ハッカー、機転が利くコンピュータに詳しい人って盛んに訴えても、無視されてる。

最近は、良いハッカーの事を、ホワイトハッカー、マスコミが誤用してるハッカーを、ブラックハッカーと言うようになった。でも、この用法は、差別だと言い出して、潰されつつある。

(setq prolog-system 'gnu)

こうしておいて、早速z.plにコードを書き、起動してソースをC-c C-l で読み込ませてみる。

N-Prolog Ver 1.2
?- [['['/['/t['/tm['/tmp['/tmp/['/tmp/n['/tmp/np['/tmp/npr['/tmp/npro['/tmp/npr\
ol['/tmp/nprolo['/tmp/nprolog['/tmp/nprolog/['/tmp/nprolog/z['/tmp/nprolog/z.['\
/tmp/nprolog/z.p['/tmp/nprolog/z.pl['/tmp/nprolog/z.pl'['/tmp/nprolog/z.pl']][[\
'/tmp/nprolog/z.pl'].
yes
?- p(3,4,5).
pp(p(3p(3,p(3,4p(3,4,p(3,4,5p(3,4,5))(p(3,4,5).
no

どうも、重ね打ちしてるみたいな雰囲気がするな。それを無視すれば、ちゃんと読み込んでいる。そして、残念ながら、思った通りには動いていない。ピタゴラ3角形は完成してるはずなんで、yesと言って欲しい。

ああ、重ね打ち問題、解決した。main.cにある

//-----editor-----
int repl_flag = 0;  //for REPL read_line 1=on, 0=off

フラグを落としてしまうだけ。halt.とかした時に、水色にならなくても、気にしない。 結論は以上だけど、そこに至る経過も書いておく。

nprologのマニュルを見てたら、-rオプションを発見。replの編集モードをOFFに出来るとな。これは、試してみる価値がありそうと野生の勘が働いた。ちょいと-r付きで起動すると、そんなオプションは無いと言う。マニュアルの間違い? ソースが真実を語るってんでmain.cを初めて閲覧したよ。そしたら、何とリナ限定のオプションだった。

そんな限定は、取り払ってしまえ。取り払ったらオプションが効くようになったよ。後は、オプション付きのgprologにすればいいんだな。簡単なラッパー(shell script)を作ったよ。 で、いざemacsから起動すると、エラー。間にラッパーを挟むなんて許していない。そりゃそうだわな。emacsとnplが直接やり取りしなきゃいけないんで、無理な相談と言われるのは、あたりまえ。

29952 p2  S+       0:00.78 /home/sakae/bin/gprolog
33812 p3  S+       0:01.52 emacs z.pl (emacs-27.1)

こんな風に、偽物が走ってます。参考までにgprologを止めて、nplで何とかならないかとprolog.elを見て億。

(defcustom prolog-keywords
  '((eclipse
     ("use_module" "begin_module" "module_interface" "dynamic"
      "external" "export" "dbgcomp" "nodbgcomp" "compile"))
        :

(defcustom prolog-program-name
  `(((getenv "EPROLOG") (eval (getenv "EPROLOG")))
    (eclipse "eclipse")
     :
    (t ,(let ((names '("prolog" "gprolog" "swipl" "pl")))
          (while (and names
                      (not (executable-find (car names))))
            (setq names (cdr names)))
          (or (car names) "prolog"))))
  "Alist of program names for invoking an inferior Prolog with `run-prolog'."
  :group 'prolog-inferior
  :type '(alist :key-type (choice symbol sexp)
                :value-type (group (choice string (const nil) sexp)))
  :risky t)

このあたりを何とかすれば、何とかなりそう。あえてgprologと偽らなくても、一般系のprologでもplでも、見繕って起動してくれそうだ。所で、nplのkeywordsって、どんなのが有るのだろう? マニュアルに説明有るかな?

?- yes
?- p(3,4,5).
no

何を読み込んだか、報告は無いけど、ちゃんと読み込んだ証拠にyesと言ってるし。 文法間違いをしてれば、

?- Syntax error not two operand with an operator
around here line=1 column=0

ちゃんと文句を(赤字で)言ってくるので、必要十分。こうやって環境を整えていくのも楽しいな。

ああ、前回から引きずっている、BSSが大きい問題は、エリアサイズを全て半分に設定した。 コードをちょい見してたら、cell配列の一部は、ワークエリアに使ってるのね。知らんかった。

それから、gdbにかける都合上、gccのオプションは、-O3を止めて、-O0 -g を指定した。 余計なオプティマイザーが走らないので、コンパイルスピードが早くて好都合。それと、BSS対策でエリアの要求も半分なので、OSに易しい、起動が速いといい事ずくめ。gcが走るような大きなコードを書かない限り、これで十分だな。

で、上のyesと言って欲しい問題なんだけど、そもそもprologの原理原則を知らないから、知恵が回らないんだな。

lispで書いたprologの説明は読んだけど、難易度が高いと思った。そもそもlispよりschemeの人だからね。手元にSICPが有るんで、何か書いてないか確認。やっぱり有ったね。

計算機プログラムの構造と解釈 第二版 ここの4.4節 論理プログラムを見るべし。 あっ、別な人によるSICP(PDF)版 もあるぞ。

SICPなんてマニアックな本が無い人ように、炙り出しておいたよ。 そして、ggしてる最中に、 宣言型プログラミングの可能性と限界 なんて言う楽しい記事を発見。それから、nprologの作者さんご愛読の本のコードを Common Lisp版Portable Prologを動かすメモ に発見。やはりlispの重鎮さんは、眼の付け所が鋭い。

長くなってきたので、say yes 問題は次回に続く。

ああ、一つ思い出した事がある。中学校の英語の教科書に、比較級の説明があった。その例題に、『牛乳を配達する人は、それを呑む人より健康である』ってのが出てた。

当然、原文は忘れてしまったけど、これがずっと心の隅に鎮座してたよ。 今風に直すと、『インプリメンターは、それを使う人よりも楽しめる』とでもなるのかな。

使ってなんぼより、作って、改造してなんぼ なんだよな。楽しんでますよ。


This year's Index

Home