Tuesday, 15 May 2007

Prolog



仕事が進まんなぁ。琉大の学生に Prolog を教えたこともあるんだけど...

 http://bach.istc.kobe-u.ac.jp/prolog/intro/

に入門があるな。



SICStus 4.0.0 (i386-darwin-8.8.1): Thu Mar 1 22:07:26 CET 2007

Licensed to SP4ie.u-ryukyu.ac.jp temp

| ?- compile(user).

% compiling user...

| ap([],X,X).

| ap([H|X],Y,[H|Z]):-ap(X,Y,Z).

| ^D

% compiled user in module user, 0 msec 224 bytes

yes

| ?- ap(X,Y,[a,b,c,d]).

X = [],

Y = [a,b,c,d] ? ;

X = [a],

Y = [b,c,d] ? ;

X = [a,b],

Y = [c,d] ? ;

X = [a,b,c],

Y = [d] ? ;

X = [a,b,c,d],

Y = [] ? ;

no

| ?-



ってな感じで、append プログラムを逆に実行できて、append すると、[a,b,c,d]になる二つのリストをすべて生成できたりします。Erlang の構文は、これから来ているわけだ。



経験的に、Prolog で記述するとプログラムの大きさはCの1/5ぐらいになります。



C で書くと、



typedef struct list { struct list *car, *cdr; } List, *ListPtr;



#define New(x) ((x)*)(malloc(sizeoif(x)))



ListPtr

append(ListPtr x,ListPtr y)

{

  ListPtr z;

  if (x==NULL) return y;

  z = New(List);

  z.car = x.car;

  z.cdr = append(x.cdr,y);

  return z;

}



こんな感じ。逆に実行できるversionは、書く気がしないです。



http://mixi.jp/view_diary.pl?id=29297243&owner_id=2510



に、



Naive Reverse bench mark で、(おそらく1.6GHzなPowerPC)

Sicstus Lips = 10,782,608

SWI-Prolog Lips = 2,240,290

XSB Lips = 3,444,448



とか書いてあるが、システム更新で入れた i386 なSICStus Prolog (4.0.0)を試してみる。2.33GHz Core Duo で、



Lips = 125,888,324



おぉ、凄いです。2年で十倍か。確か、第五世代プロジェクトは、1台1MLips、1000台で1GLipsを目指していたはず。最初に使った C Prolog は、200Lips だった。



これは、i386 なnative compiler かも知れない。と思ったら、

 The internal representation of Prolog terms and code has been

 redesigned, resulting in code that runs up to twice as fast

 as in release 3. Native code compilation has been dropped.

とか書いてあるな。byte code interpreter で、この速度は偉いが、まだ、そんな余地があったのか。



なんだが、自分で書いたアプリケーションが軒並動かないです。Parser が変わったのと、abolish のsemantics が異なるらしい、って、なおす根性ないよ... あぁ、ISO Prolog の関係か。



http://tinyurl.com/2ea9m3



SICStus v3.x の頃も、-iso とかすると ISO Prolog になっていたらしい。で、4.0 になって、昔のモードはなくなったわけか。まぁ、いいけどさ。OS X なppcのSICStus は買わなかった(?!)ので、もう動かさないかも知れない。



昔は、SICStus Prolog はsource code license を持っていたので、どんな(マイナーな)OSでも、それをコンパイルして使っていたのだが... OS X の出始めの頃でも、さくっと動かしていたらしい。今回は、「でるまで待てばいいや」パターンだったようです。



 http://kaminari.scitec.kobe-u.ac.jp/PrologCafe/



とかも面白そうだ。Lips = 18,731 らしい。compile すると、Lips = 5,835,294 か。なかなかです。

No comments: