プログラム「ソフトウェアの検索」


micro-Quixote プログラムの例として、 「ソフトウェアの検索」を紹介しましょう。

これが 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 のライセンスについての
% 情報がデータベースになかったので、このような仮説付きの
% 答が返されました。