これが micro-Quixote プログラム「ソフトウェアの検索」です。 但し、このプログラムは IFS で公開している micro-Quixote では実現していないモジュール を使用していて、プログラムの実行は、外部のフィルタとの組合せで実現しました。 この外部フィルタは、残念ながら IFS で公開していません。 (参考文献はこちら)
&program;; &subsumption;; gcc =< software;; % 「gcc はソフトウェアである」ことを示しています。 editor =< {software, tool};; % 「エディタはソフトウェアであり、ツールである」 emacs =< editor;; % 「Emacs はエディタである」 gnu >= {emacs, gcc};; % 「Emacs, GCC は GNU の product である」 mule =< emacs;; % 「Mule は、Emacsを特化したものである」 mule >= {"mule-1", "mule-2"};; % 「Mule には、"mule-1" と "mule2" がある」 media >= {"CMT", 8mmTape, floppy};; % 「media には、カートリッジ、8mm テープ、 % フロッピーがある。」 &rule;; ftp:: % ftp サイトの情報を保持しています。 { ftp_site[category=mule, where="etlport.etl.go.jp", directory="/pub/mule"];; % 「etlport には mule がある。」 ftp_site[category=gnu, where="prep.ai.mit.edu", directory="/pub/gnu"];; % 「prep には gnu がある。」 } editor:: % エディタ (mule emacs) に関する知識を保持しています。 { emacs/[ext_language="Emacs Lisp", required_memory="Big"];; % 「emacs は拡張言語に "Emacs Lisp" を用い、 % 大きなメモリを使用する」 mule/[text=multi_lingual];; % 「mule は 多言語の text を扱う」 "mule-1"[based="emacs-18"] /[status=released, size="Big"];; % 「"mule-1" は "emacs-18" をベースとし、 % 既にリリースされていて、大きなメモリを使用する」 "mule-2"[based="emacs-19"] /[status=alpha, size="Very Big"];; % 「"mule-2" は "emacs-19" をベースとし、 % αリリースされていて、大変大きなメモリを使用する」 Software/[distribution=D]|{ Software =< software } <= distribution:distributable[software=Software, media=M, form=FORM], distribution:D/[media=M] || { D =< FORM };; % 「ソフトウェアの配送は、配送形態とメディアにより % 決定される。」 } distribution:: % ソフトウェア配布に関する知識を保持しています。 { distributable[software=Software, media=M, form=FORM] <= Software/[licence="GNU General Public Licence", size=SIZE], distribution:M/[size=SIZE] || { Software =< software, M =< media, FORM=freely_distributable};; % 「ソフトウェアのメディアと形態は、ソフトウェアの % ライセンスとサイズで決まる。」 floppy/[size=small];; "CMT"/[size="Big"];; 8mmTape/[size="Very Big"];; % メディアとそのサイズの情報が記述されています。 freely_ditributable[media=floppy];; freely_ditributable[media="CMT"];; freely_ditributable[media=8mmTape];; charged[media=floppy];; % 配布形態とメディアの情報が記述されています。 } file:: % micro-Quixote のオブジェクトを外部のデータベース % (ftp サイトのファイル)と結び付けるルールを保持し % ています。このルールによって、プログラムには直接 % 記述されていないオブジェクトを、あたかもあるかの % ように見せます。この micro-Quixote のオブジェクト % と外部のデータベースの結び付きは、解の検索時に動 % 的に行なわれます。 { FILE/[category=C, where=Where] <= ftp:ftp_site[category=C, where=Where, directory=P], ext:ftp_ls[where=Where, directory=P, file=File], ext:ftp_file_date[file=FILE], ext:ftp_file_owner[file=FILE];; } ext:: % 外部呼び出しの手順を示す、ルールを保持しています。 { ftp_ls[where=Where, directory=D, file=F] <= &true || { F ## ftp_ls[site=Where, directory=D], F =< &top[where=Where, what=What]};; ftp_ls[where=Where, directory=D, file=F] <= ftp_ls[where=Where, directory=D, file=F] || { F ## ftp_ls[site=Where, directory=D], F =< &top[where=Where, what=What]};; % ftp サイトに対し、ls を行ないます。 ftp_file_date[file=FILE] |{ FILE.data == Date } <= &true || { Date ## ftp_file_date[file=FILE] };; % ファイルの日時の情報を取得します。 ftp_file_owner[file=FILE] |{ FILE.owner == Owner } <= &true || { Owner ## ftp_file_owner[file=FILE] };; % ファイルの所有者の情報を取得します。 } &end.
% Emacs に関するファイルを列挙したいなら、以下のようにすれば良い % です。 ?- file:FILE/[category=emacs]. % micro-Quixote の答えは以下の通りです。 no. % これは、カテゴリ emacs で直接サービスしている ftp サイトがない % ことを示しています。そこで、Quixote では次のように制約を用いて、 % 検索条件を広げることができます。 % まず、カテゴリに対する検索条件を上位概念を含めて検索することに % よって、検索する ftp サイトの対象を広げます。但し、関係ないもの % まで検索されるのを避けるために、ファイルが何であるかという属性の % what で emacs を指定します。 ?- file:FILE/[category <- emacs, what=emacs]. % micro-Quixote の答えは以下の通りです。 FILE = "emacs-18.59"[where="prep.ai.mit.edu", what=emacs] FILE = "emacs-19.25"[where="prep.ai.mit.edu", what=emacs] % emacs の2つのバージョンが見つかりました。これは、カテゴリに % emacs の上位概念である gnu が見つかり、gnu をサービスする ftp % サイト、"prep.ai.mit.edu" で emacs が検索されたためです。 % 次に、もう一つの検索条件を広げる方法を説明します。 % それは、最初の質問の答が求まらなかったのは、category=emacs と % いう指定が一般的過ぎて見つからなかったとも考えられるので、 % カテゴリに関する検索条件をより具体的にし、emacs より下位概念と % して質問してみる方法です。それは以下のようになります。 ?- file:FILE/[category -> emacs]. % micro-Quixote の答えは以下の通りです。 FILE = "mule-1.0"[where="etlport.etl.go.jp", what=editor:mule] FILE = "patch-1.0-01"[where="etlport.etl.go.jp", what=patch] FILE = "README-1.0"[where="etlport.etl.go.jp", what="README"] % mule、patch、README が見つかりました。これは、emacs の下位 % 概念である mule をサービスする ftp サイト "eltport.elt.go.jp" % でファイルが検索されたからです。属性の what を特に指定しなかった % ので、patch や README も解となっています。 % mule の拡張言語に関する問い合わせは以下のようになります。 ?- editor:mule/[ext_language=EL]. % micro-Quixote の答えは以下の通りです。 EL = Unbound if { editor:mule.ext_language==EL } EL = Unbound { editor:mule.ext_language==EL, "Emacs List" >= EL } % 最初の解は、micro-Quixote は属性継承の実現を可能性の列挙と % している(参考文献はこちら) % のために、問い合わせそのままが出力されています。 % 二番目の解から、mule の拡張言語は Emacs Lisp に包摂されている % ものだということが分かります。 % この問合せに対する答えは、属性継承の機能により得られています。 % つまり、包摂関係を用いて mule は emacs の下位概念であると定義 % されているので、ext_language、memory の属性が emacs から自動 % 的に継承されています。 % 「mule の一種」といえる、エディタの検索は以下の問合せで % 実行できます。 ?- editor:MULE|{MULE =< mule}. % micro-Quixote の答えは以下の通りです。 MULE = mule MULE = "mule-1"[based="emacs-18"] MULE = "mule-2"[based="emacs-19"] % 「mule の一種」といえる、エディタは、3つあって、 % mule と emacs-18 をベースとした mule-1 と % emacs-19 をベースとした mule-2 です。 % emacs-19 をベースとした mule-2 の配布については % 以下のように問い合わせればよいです。 ?- editor:"mule-2"[based="emacs-19"] /[distribution=D]. % micro-Quixote の答えは以下の通りです。 D = freely_distributable[media=8mmTape] if { "mule-2"[based="emacs-19"].licence== "GNU General Public Licence" } % これは、emacs-19 をベースとした mule-2 のライセンスが % "GNU General Public Licence" であったなら、(8mmTape で) % 自由に配布可能であるという、仮説付きの答です。 % emacs-19 をベースとした mule-2 のライセンスについての % 情報がデータベースになかったので、このような仮説付きの % 答が返されました。