Posted 2016-11-30 15:00:59 GMT

レトロLisp アドベントカレンダー 第1回目は、FLPL についてです。

FLPLは、Fortran-Compiled List-Processing Languageの略とのこと(Compiledはどこに消えた)。

Fortran内から呼び出すFLPLのリスト処理ライブラリという感じなので、Lisp方言では無いですが、なんとなく思い付きでレトロLispの枠内に入れてみました。

しかし、それじゃあIPLはどうなんだという話になってしまうかもしれませんが、FLPLにはマッカーシー先生も関わっているということでLispの範疇に入れてしまいましょう。

方言の系統

LISP 以前

主要開発者

Nathaniel Rochester、Herbert Gelernter

登場時期

1956-1958

後続への影響

LISPの土台となった種々のアイデアを思い付く切っ掛けとなった

CAR、CDR(要検証)

概要

FLPLについては、History of Lispに詳しいですが、IBMのGeometry Theorem-Proving ProjectのためのGeometry Machineを実現するものとして開発されました。

このプロジェクトの元のアイデアはミンスキー先生のもののようですが、FLPLにはマッカーシー先生のアドバイスが活かされているようです。

FLPLが扱う式については、条件式も再帰もなく、利用されなくなったリストの消去もプログラマによって明示的に処理するものだったようです。

どんな感じのコードだったかというと、A Fortran-Compiled List-Processing Languageによると、

INDEX = LPTS. 10 IF(CWWF(XCAR2F(INDEX)) - 2.0) 15, 15, 20. 15 INDEX = XCDRF(INDEX). 20 NAMEPT = XCARF(INDEX). GO TO (EXIT TO ROUTINE FOR PROCESSING NAMEPT). 25 (EXIT WHEN LPTS CONTAINS NO POINT WITH X-COMP > 2.0).

のようなものだったようですが、 XCARF とか、 XCDRF にお馴染の CAR 、 CDR があります。

XCDRF(J), XCARF(J), XCPRF(J), XCSPF(J), XCTRF(J) Extract contents of the (decrement, address, prefix, signed prefix, tag) register of the word stored in location J.

とのことなので、良くいわれるLISPのCAR/CDRの説明そのままですね。

マシンが同じくIBM 704ということもありますが、FLPLからそのままLISPへ持っていったのでしょうか。

また、

XCARF(XCDRF(LPTS)) ⇒ β1, the name of the second point on LPTS.

なんていう説明もありますが、LISPでいえば (CAR (CDR LPTS)) といった所です。

さらに、上記は、LISPのように、 XCADRF とも書け、LISPの (CAAAR J) ようなものは、 XCAR3F(J) とも書けるようで、AとDの組み合わせは、FLPLから存在したようです。(ちなみにXCARnF/XCDRnFの繰り返しは、1から9まで)

それはさておき、FLPLを利用する中で、問題に対してFLPLの機能が十分でないことだけでなく、問題の解決にはサブルーチン呼び出しが必要であることに開発者は気付きますが、この辺りの知見も、LISP 1に活かされているようです。

また、マッカーシー先生は、FLPLを試してみる中で、以前から考えていた、再帰、条件式、リストのマップ関数、無名関数、不要メモリの自動回収等のアイデアをFLPLに付け足すことを考え、それを提案したようですが、グループは既にそこそこ満足していたようで、提案された機能は不要との主張があったようです。

ここでグループが乗り気だったら、FLPLがそのまま進化していったのかもしれません。

ちなみに、Geometry Machineでできたことですが、与えられた条件から平行四辺形は成立しているかを証明できたりはしたようです。

Premises

Quad-lateral ABCD

Point E midpoint segment AB

Point F midpoint segment AC

Point G midpoint segment CD

Point H midpoint segment BD

To Prove

Parallelogram EFGH

Syntactic Symmetries

BA, AB, DC, CD, EE, HF, GG, FH, CA, DB, AC, BD, GE, FF, EG,

HH, DA, CB, BC, AD, GE, HF, EG, FH

Proof

Segment DG equals segment GC Definition of midpoint Segment CF equals segment FA Definition of midpoint Triangle DCA Assumption based on diagram Precedes DGC Definition of midpoint Precedes CFA Definition of midpoint Segment GF parallel segment AD Segment joining midpoints of sides of triangle is parallel to base Segment HE parallel segment AD Syntactic conjugate Segment GF parallel segment EH Segments parallel to the same segment are parallel Segment HG parallel segment FE Syntactic conjugate Quad-lateral HGFE Assumption based on diagram Parallelogram EFGH Quadrilateral with opposite sides parallel is a parallelogram Total elapsed time = 1 .03 minutes

まとめ

私は、LISP初期からLISP 1.5あたりには全然興味がないので調べる気力が湧かないのに加え、この辺りは割合にちゃんと研究している人も多い気がするため、適当なことを書くのも気が引けて雑なまとめになりました。

とはいえ、マッカーシー先生のHistory of Lispも翻訳されてなかったりはしますので、初期LISPについて日本語できちんとまとまった資料が読んでみたいですね。

参考文献

■

