Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2010-07-19

(39)LispマシンELIS上の新Lisp TAO(1982)

| 04:18 | (39)LispマシンELIS上の新Lisp TAO(1982) - わだばLisperになる を含むブックマーク はてなブックマーク - (39)LispマシンELIS上の新Lisp TAO(1982) - わだばLisperになる

TAO関係の論文を漁っておりますが、今回は、

です。

これまで眺めた論文では、LISP+Prologという感じでしたが、本文あたりからSmalltalkが加わるようです。

内容は、Prologとの融合、Smalltalkとの融合という流れて進みます。

Prologとの融合

まずは、Prologとの融合で、ユニフィケーションの関数化について説明があり、無名関数のLAMBDAのようにユニフィケーションが書けるようです。

((lambda (x) (car x)) '(1 2 3 4))

に対して

((&+ (*x . *y) *x) (1 2 3 4))
; ⇒ 1

これは主にパターンマッチの機能で比較的分かりやすいかと思います。

次にバックトラックなどですが、

(Hclauses (&+ ...) ... (&+ ...))

という形式で、本体内の式でnon-NILな式があればその値を返し、そうでなければバックトラックする述語の無名関数版のようなHclausesが基本になるようです

((Hclauses (&+ (*x *y . *z) *x) (&+ (*x *y *x) *y)) (1 (*a 2) *a))

は、Prologでいう

hclauses([X,Y|Z], X).
hclauses([X,Y,X], Y).

?- hclauses([1,[A,2],A],X).
X = 1 ; (バックトラックさせる)
A = 1,
X = [1, 2].

のようなものの無名版のようです。

他には&や、!があり、prologのように、","で継げて書くには、&を利用するようです。

(& (*x *y)    
   (belong *x (1 2))  
   (print (list 'pre *x (if-undef *y 'U)))
   (belong *y (4 2))                      
   (print (list 'post *x *y))             
   (== *x *y) )

は、

?- belong(X,[1,2]),
    print([pre, X]),nl,
    belong(Y,[4,2]),
    print([post,Y]),nl,
    X=Y.
[pre, 1]
[post, 4]
[post, 2]
[pre, 2]
[post, 4]
[post, 2]
X = 2,
Y = 2 ;
false.
% belongの定義
belong(X,[X|_]).
belong(X,[A|Y]) :- belong(X,Y).

的な感じなのでしょうか。

また、Prologと違う点は、論理変数にはスコープを設定でき(上のコードの例でいうと&の次のリストで利用する変数を宣言している)、このスコープによって色々と挙動を変化させることができるとのことで、挙動の違いの解説があります。

Smalltalkとの融合

ぱっと見た感じでは、MITのFlavorsのような感じですが、角括弧の記法で、

[<receiver> <message> . <args> ]

と書けるようです。

[3 + 4]
;⇒ 7

と表現できるようなのですが、丸括弧も使えるようなので

(3 + 4)
;⇒ 7

(defun factorial (n)
  (cond (n = 0) 1)
        (t (n * (factorial (n - 1)))) )

のように部分的に中置だったり前置だったりカオスな記述もできたようです。

パフォーマンスについては、「TAO では Lisp で定義した append と Prolog 風に定義した append の速度比は 1:1.5 以内, Lisp 式 (+ x y) と Smalltalk 風の (x + y) とは同速度となっている.」とのことで3つのパラダイムは十分に混合して利用できたようです。