02/07/27 01:31
>>maximanさんへ
補足です。
algsys.lispが 代数的に連立方程式を解くための関数が まとめられている
ファイルです。自分用のsolve関数を書くための hackingの参考になること
を少し書きます。この手のソースの解説がでまわるのは数年以上先になるはず
でそんなに待っていられないし、shelterさん亡き後 解説できるのはFateman
さん Willisb(Barton)さん他数人にすぎず、研究にも忙しいから出ない可能性
もある。ということで 自力しかない。はじめに だれでもできるprint スタイ
ルのやり方をおこなう。特にLISPに詳しい必要がないのがこの方法の良い点だ
ろう。勿論手をいれる段階では より詳しい知識が必要だが それでもGCLにつ
いては 岩波書店 Common Lisp 入門 湯浅太一.萩谷昌己 著 で十分だったり
する。不思議と今でもよく売れていると見えて大きな本屋には必ずある。
これと Paradigms of Artificial Intelligence Programming:Case Studies
in Common Lisp Peter Norvig著 MORGAN KAUFMANN との差が彼我の実力の
差であるが これからの人によって乗り越えられることを望む。
Commn Lisp 入門 のP268にあるように組込みのスペシャル変数*features*は
LISPシステムでその特質をあらわす記号が リストでくくられている。
そのリストの最後にDEBUG1という記号を追加して*features*にこれがあるとき
だけ print文を実行させるようにする。要するにCのスタイル。
#+debug1 (print 見たい変数)でよいのです。
そのため 次ぎの1行をalgsys.lispの はじめの方に加えておきます。
(setq *features* (reverse (cons 'DEBUG1 (reverse *features*))))
algsysの本体はマクロ関数(defmfun $algsys (lhslist varxlist &aux
varlist genvar)で$algsysのように$ではじまる関数は インタープリタから
(C30)algsys([beta*r*k-alph*w*l,x-k^alpha*l^beta],[k,l]); >>66
などと使える。あ忘れていましたが algsys.lispはソースのdirから自分の
作業するdirにコピーしてこれに手をいれます。(C32)load("algsys.lisp")$
とすることで変更したalgsysがその場で使えます。変更してloadしてのくり返
しで中味に迫るわけです。
ここで肝心の連立方程式はlhslistで[beta*r*k-alph*w*l,x-k^alpha*l^beta]
の内部表現はソースの
(defmfun $algsys (lhslist varxlist &aux varlist genvar)
; (declare (special varxlist)) ;;??
(setq $%rnum_list (list '(mlist)))
ここに#+debug1 (print lhslist)をいれて
(cond ((not ($listp lhslist))
。。。。。。。。。。。。。。
(C32)load("algsys.lisp")$
(C33)algsys([beta*r*k-alph*w*l,x-k^alpha*l^beta],[k,l]);とすれば
((MLIST SIMP)
((MPLUS SIMP) ((MTIMES SIMP) |$beta1| |$k| |$r|)
((MTIMES SIMP) -1 |$alph| |$l| |$w|))
((MPLUS SIMP)
((MTIMES SIMP) -1 ((MEXPT SIMP) |$k| |$alpha|)
((MEXPT SIMP) |$l| |$beta1|))
|$x|))
となりlhslistのひとつの内部表現がえられた。
次ぎに続く lambda式のなかで
lambdaの基本形は(lambda (x) (* x x)) このxにあたる
lambdaの変数は (tlhslist *tvarxlist* solnlist $ratprint $ratepsilon
$keepfloat varlist genvar $ratfac $breakup
$solvefactors *roots *failures *ivar* $polyfactor
varxl $infeval $numer $float numerflg)
こんなにあるがスペシャル変数で他で定義されているものも多い。
ここではvarxl、tlhslist、*tvarxlist*が決められている。
各setqの()のあとにprintを入れて上と同じことをくり返す。