Yet Another Ranha このページをアンテナに追加 RSSフィード

2011-12-31

Prologとつき合う

00:32 | Prologとつき合うを含むブックマーク Prologとつき合うのブックマークコメント

C81 3日目東ペ06a - COMFRK VOL. 3 ( http://comfrk.info/ )の宣伝のつもりで書き始めてます

えーと記事のタイトルは「年末年始Prolog入門モドキ by ranha」ということになっていますが、嘘ですんで…。

ネムインダ

最近、SWI-Prologでは次のようなプログラム片がtrueを返すようになりました。

p :- p.
?- p.
true ;
true ;
true ;
...

ウウーン良いですね。いや…ダメだよコレは。

ということを、ぼくの担当分で紹介しています。といっても入門記事なので全く新規性のある話をしているわけではないのですが。

ここまでが記事の紹介です。

C81 3日目東ペ06aに来てくださいね!!


この後は記事の目論みといいますかなんというか…。

所謂Prologのプログラムのセマンティクス(意味)というのをどのようにして与えるかと言われると、

普通は」プログラムのあーだこーだを取った時の最小不動点がマサにソレだ(否定を入れると話は危険な領域に突入するのですが)という事に成ります。

ちなみに、上のプログラムの最小不動点は「何も無い。空集合」です。

ですから、そのような「何も分からない」ところから「pが成り立つ」ということが分かるのは非常に悪いわけですね。

ところが上をご覧の通り成り立っていまして…ていうのはこれもまた嘘で。

実はプログラム全体は次のようになっております。

:- use_module(library(coinduction)).
:- coinductive p/0.

p :- p.

刮目せよ!!!

SWI-Prologのバージョンなんたら(少なくとも5.10.4)からは、なんとcoinductionが使えるようになっています。

結構お粗末な感じではありますが…。

でこのcoinductionが使えると何が嬉しくなるのかというと、今迄皆さんが生死を共にして来た"occur check無しのunification"が水を得た魚成ると。

例えば、またしても次のプログラム。

num(z).
num(s(X)) :- nat(X).

まぁ自然数かどうかをチェックする代物なのですが、ここでX = s(X)の等式を満たす悪魔じみた数X(ωと呼ぶと見栄えが良いですが)を渡すと

?- X = s(X) , num(X).

絶対に返ってきません。

まぁそもそもこれで返ってくるとエラいこっちゃという話なのですが。(元のプログラムの意味を最小不動点に依るものとすると、自然数しか含まないので化け物は含まれない為)

ここでお呪いを唱えます!!

:- use_module(library(coinduction)).
:- coinductive num/1.

num(z).
num(s(X)) :- num(X).
?- X = s(X) , num(X).
X = s(X) ;
X = s(X) ;
X = s(X) ;
X = s(X) .

ヤッタゼ!!!

ということで、こういう「無限サイズの項」が扱えるようになります。ωは無限サイズですけど、任意の自然数は高々有限サイズですよね。

こういうのは一体何の役に立つのかというと、まぁ非常に自明ですが有名な例として、「ストリーム」があるでしょう。

bit(0).
bit(1).
stream([H|T]) :- bit(H) , stream(T).

まぁリアルなプログラムを書いてるとこういう「無限サイズのデータ」が扱いたくなるようです。

例えば、0が無限に続いてるとストリームですか? とPrologにおたずねすると

?- X = [0 | X] , stream(X).

話に成りません。いや、ならないで然るべきなのですが。しかしここで、またしてもお呪いです。

?- X = [0 | X] , stream(X).
X = [0|X] ;
X = [0|X] ;
X = [0|X] .

やりました!!

こういうCo-Logicアプローチというのは最近ぼくの中では非常に流行っていまして、

例えば"Coinductive Logic Programming for Type Inference"(http://www.computing.dundee.ac.uk/staff/katya/TYPES11.pdf)、

これを紹介するのは反則な気もするのですが、兎に角色々面白いところです。

かようなプログラムに関するお話を読む時の基本は、coinduction云々は勿論ありますが、まずは何より普通のエルブランモデルですとか、最小不動点意味論に馴染みがあるかどうかという所が大きい話だと思いますので、最も基本的なエルブランの定理(モデルの方の。スコーレムの基本定理と書いた方が宜しいでしょうか)の証明を書散らしたみたいな感じになっています。

トラックバック - http://d.hatena.ne.jp/ranha/20111231

2011-11-30

今年読んだ面白CS論文紹介カレンダー

23:48 | 今年読んだ面白CS論文紹介カレンダー を含むブックマーク 今年読んだ面白CS論文紹介カレンダー のブックマークコメント

http://partake.in/events/e92ad56b-a8eb-481f-82b8-f2c3699bb3f8

そのようなイベント作りました.

14日から開始で,既に2人参加しているのでこれからの方は,16日からですね!!

参加方法は簡単で登録するだけ、以上です.

することといえば,今年読んだ論文で面白かったものを3本以上紹介しましょうというそんだけです。

目的としては色んなconferenceとかworkshopを芋づる式に…とか年末のお供に…とか色々あるわけですが,

まぁ備忘録程度に書いてもらってもぼくが楽しいので何でも良いです.

奮って参加しましょう!!

トラックバック - http://d.hatena.ne.jp/ranha/20111130