これが big-Quixote プログラム「音楽」です。
&program;;
%# モジュール間関係 (>-) を定義します。
%%%%%%%%%%%%%%%%%%%%%%%%
&submodule;;
composer >- baroque +
	classic +
	roman +
	contemporary +
	picture;;
music >- sound + 
	piece + 
	piece_rule;;
%# 基礎オブジェクト項間関係 (>=) を定義します。
%%%%%%%%%%%%%%%%%%%%%%%%
&subsumption;;
classical_music >= 
    {symphony, chamber, concert};;
concert >= 
    {piano_concert, violin_concert};;
chamber >= {quartet, quintet};;
instrument >= {stringed,wind,
	percussion};;
stringed >= {violin, viola,cello};;
wind >= {oboe, clarinet};;
percussion >={cymbals,drum};;
piano >= {upright, grand};;
major >= {cmajor,
    fmajor,bfmajor,efmajor,afmajor,
    gmajor,amajor,emajor,bmajor};;
minor >= {aminor,
	dminor,gminor,cminor,fminor,
	eminor,bminor,fsminor,csminor};;
person >= {bob, ken};;
    
%# ルールを定義します。
&rule;;
%%%%%%%%% fact %%%%%%%%%%
%# "piece" モジュールには、作品のデータが格納されています。
%%%%%%%%%%%%%%%%%%%%%%%
% 以下は、モーツァルトの最後の6つの交響曲を記述しています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を示します。
piece::k385/[composer=mozart, 
	type=symphony, no=35, 
	key=dmajor, year=1782];;
piece::k425/[composer=mozart, 
	type=symphony, no=36, 
	key=cmajor, name=lintz, 
	year=1783];;
piece::k504/[composer=mozart, 
	type=symphony, no=38, 
	key=dmajor, name=prague, 
	year=1786];;
piece::k543/[composer=mozart, 
	type=symphony, no=39, 
	key=efmajor, year=1788];;
piece::k550/[composer=mozart, 
	type=symphony, no=40, 
	key=gminor, year=1788];;
piece::k551/[composer=mozart, 
	type=symphony, no=41, 
	name=jupiter, 
	key=cmajor, year=1788];;
% 以下は、モーツァルトの最後の7つのピアノ曲を記述しています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を示します。
piece::k466/[composer=mozart, 
	type=piano_concert, no=20, 
	year=1785];;
%	(key=dminor)
piece::k467/[composer=mozart, 
	type=piano_concert, no=21, 
	year=1785];;
% 	(key=cmajor)
piece::k482/[composer=mozart, 
	type=piano_concert, no=22, 
	year=1785, key=efmajor];;
piece::k488/[composer=mozart, 
	type=piano_concert, no=23, 
	year=1786, key=amajor];;
piece::k491/[composer=mozart, 
	type=piano_concert, no=24, 
	year=1786, key=cminor];;
piece::k503/[composer=mozart, 
	type=piano_concert, no=25, 
	year=1786, key=cmajor];;
piece::k537/[composer=mozart, 
	type=piano_concert, no=26, 
	year=1788, key=dmajor, 
	name=coronation];;
piece::k595/[composer=mozart, 
	type=piano_concert, no=27, 
	year=1791, key=bfminor];;
% 以下は、その他のタイプのモーツァルトの作品が記述されています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を、
% instruments* で演奏される楽器を示します。
piece::k388/[composer=mozart, 
	type=ensemble, key=cminor, 
	year=1782, 
	name="a small night music"];;
piece::k330/[composer=mozart, 
	type=piano_sonata, 
	key=cmajor, year=1778];;	
piece::k331/[composer=mozart, 	
	type=piano_sonata, 
	name="Turkish march",
	key=amajor, year=1778];;	
piece::k301/[composer=mozart, 
	type=violin_sonata, 
	instruments* =*= {violin,piano}, 
	key=gmajor, year=1778];;	
piece::k622/[composer=mozart, 
	type=clarinet_concert,
	key=amajor, year=1791];;
% 以下は、ベートーベンの9つの交響曲が記述されています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を示します。
piece::op21[composer=beethoven]/
     [type=symphony, no=1, 
	key=cmajor, year=1800];;
piece::op36[composer=beethoven]/
     [type=symphony, no=2, 
	key=dmajor, year=1802];;
piece::op55[composer=beethoven]/
     [type=symphony, no=3, 
	key=efmajor, name=eroica, 
	year=1804];;
piece::op60[composer=beethoven]/
     [type=symphony, no=4, 
	key=bfmajor, year=1806];;
piece::op67[composer=beethoven]/
     [type=symphony, no=5, 
	key=cminor, year=1808];;
piece::op68[composer=beethoven]/
     [type=symphony, no=6, 
	key=fmajor, name=pastoral,
	year=1808];;
piece::op92[composer=beethoven]/
     [type=symphony, no=7, 
	key=amajor, year=1813];;
piece::op93[composer=beethoven]/
     [type=symphony, no=8, 
	key=fmajor, year=1812];;
piece::op125[composer=beethoven]/
     [type=symphony, no=9, 
	key=dminor, name=coral,
	year=1824];;
% 以下は、ベートーベンの5つのピアノ曲が記述されています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を示します。
piece::op15[composer=beethoven]/
     [type=piano_concert, no=1, 
	key=cmajor, year=1795];;
piece::op19[composer=beethoven]/
     [type=piano_concert, no=2, 
	key=bfmajor, year=1795];;
piece::op37[composer=beethoven]/
     [type=piano_concert, no=3, 
	key=cminor, year=1803];;
piece::op58[composer=beethoven]/
     [type=piano_concert, no=4, 
	year=1806];;
%  (key=gmajor)
piece::op73[composer=beethoven]/
     [type=piano_concert, no=5, 
	name="Emperor",key=efmajor, 
	year=1809];;
% 以下は、ベートーベンの最後の4つのピアノソナタが記述されています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を示します。
piece::op106[composer=beethoven]/ 
     [type=piano_sonata, no=29, 
	name=hammerclavier, 
	key=bfmajor, year=1818];; 
piece::op109[composer=beethoven]/ 
     [type=piano_sonata, no=30, 
	key=emajor, year=1820];; 
piece::op110[composer=beethoven]/ 
     [type=piano_sonata, no=31, 
	key=afmajor, year=1822];; 
piece::op111[composer=beethoven]/
     [type=piano_sonata, no=32, 
	key=cmajor, year=1822];;
% 以下は、他の作品が記述されています。
% composer で作者名を、type で曲のタイプを、no で曲の番号を
% key で曲の調を、year で作曲された年を、name で曲名を、
% instruments* で演奏される楽器を示します。
piece::op001[composer=satie]/
    [type=chamber, key=cmajor, 
	name=gimnopedi, year=1900];;
piece::op002[composer=satie]/
    [type=chamber, key=cmajor,year=1900];;
piece::d667/[composer=schubert, 
    type=quintet,
    instruments* =*= {piano,
	violin, viola, cello, 
	double_bass}, 
    name="trout", key=amajor, 
    year=1800];;
piece::op001[composer=chopin]/
    [type=nocturne, key=cminor, 
	instruments* =*= {piano}, 
	name=nocturn10, year=1830];;
piece::bwv578/
    [composer=bach, type=fuga, 
     instruments* =*= {organ}, 
     key=gminor, name="little fuga", 
     year=1707];;
piece::bwv1068/
    [composer=bach, type=ensemble,
     instruments* =*= {violin,viola,cello}, 
     name = "air on the G string",	
     key=dmajor, year=1717];;
piece::op30[composer=handel]/[
	type=organ_concert,
	year=1739, no=2,
	instruments* =*= {organ,stringed,wind,percussion}];;
%# "piece_rule" モジュールには、作品に関するルールが格納されています。
%%%%%%%%% rule %%%%%%%%%%
% 以下のルールは「ピアノ曲は、ピアノとオーケストラによって演奏される。」
% を記述しています。
piece_rule::X/[instruments* =*= 
    {piano,stringed,wind,percussion}] 
	<= 
     piece:X/[type=piano_concert];;
% 「交響曲は、オーケストラによって演奏される。」を記述しています。
piece_rule::X/[instruments* =*= 
    {stringed,wind,percussion}] 
	<= 
     piece:X/[type=symphony];;
% 「ピアノソナタは、ピアノによって演奏される。」を記述しています。
piece_rule::X/[instruments* =*= {piano}] 
	<= 
     piece:X/[type=piano_sonata];;
% 「作曲した時の作曲者の年齢は、作品が作られた年から、作曲者の
%   生まれた年の差から求まる。」ことを記述しています。
piece_rule::X/[age_of_composer=A] <= 
	piece:X/[composer=C,year=Y];
	composer:C/[born=B];
	math:subtract(Y,B,A);;
%# "baroque" モジュールには、baroque 時代の作曲者のデータが
% 格納されています。
%%%%%%%%% fact %%%%%%%%%%
% born で、生まれた年を、dead で、死んだ年を、first_name で名を、
% middle_name で中間名を、last_name で姓を示します。
baroque::bach/[born=1685, dead=1750, 
	first_name="Johan",
	middle_name="Sebastian",
	last_name="Bach"];;
baroque::vivaldi/[born=1678, 
	dead=1741, first_name="Antonio",
	last_name="Vivaldi"];;
baroque::scarlatti/[born=1685, 
	dead=1757, first_name="Domenico",
	last_name="Scarlatti"];;
baroque::handel/[born=1685, 
	dead=1759, first_name="Georg",
	middle_name="Frederich",
	last_name="Handel"];;
baroque::telemann/[born=1681, 
	dead=1767, first_name="Georg",
	middle_name="Philipp",
	last_name="Telemann"];;
%# "classic" モジュールには、古典の作曲者のデータが
% 格納されています。
% born で、生まれた年を、dead で、死んだ年を、first_name で名を、
% middle_name で中間名を、last_name で姓を示します。
classic::mozart/[born=1756, 
	dead=1791, first_name="Wolfgang",
	middle_name="Amadeus", 
	last_name="Mozart"];;
classic::beethoven/[born=1770, 
	dead=1827, first_name="Ludwig",
	middle_name="van",
	last_name="Beethoven"];;
classic::haydn/[born=1732, 
	dead=1809, 
	first_name="Franz",
	middle_name="Joseph",
	last_name="Haydn"];;
%# "roman" モジュールには、roman 時代の作曲者のデータが
% 格納されています。
% born で、生まれた年を、dead で、死んだ年を、first_name で名を、
% middle_name で中間名を、last_name で姓を示します。
roman::brahms/[born=1833, 
	dead=1897, 
	first_name="Johannes",
	last_name="Brahms"];;
roman::schubert/[born=1797, 
	dead=1828, 
	first_name="Franz",
	last_name="Schubert"];;
roman::mendelssohn/[born=1809, 
	dead=1847, first_name="Felix",
	middle_name="Mendelssohn",
	last_name="Bartholdy"];;
roman::chopin/[born=1810, 
	dead=1849, 
	first_name="Fryderyk",
	last_name="Chopin"];;
roman::shumann/[born=1810, 
	dead=1856, 
	first_name="Robert",
	last_name="Schumann"];;
roman::liszt/[born=1811, 
	dead=1886, first_name="Franz",
	last_name="Liszt"];;
roman::verdi/[born=1813, 
	dead=1901, first_name="Giuseppe",
	last_name="Verdi"];;
roman::wagner/[born=1813, 
	dead=1883, first_name="Richard",
	last_name="Wagner"];;
roman::mahler/[born=1860, 
	dead=1911, first_name="Gustav",
	last_name="Mahler"];;
roman::strauss/[born=1864, 
	dead=1949, first_name="Richard",
	last_name="Strauss"];;
roman::dvorak/[born=1841, 
	dead=1904, first_name="Antonin",
	last_name="Dvorak"];;
roman::mussorgsky/[born=1839, 
	dead=1881, first_name="Modest",
	last_name="Mussorgsky"];;
roman::tchaikovsky/[born=1840, 
	dead=1893, first_name="Peter",
	last_name="Tchaikovsky"];;
roman::rakhmaninov/[born=1873, 
	dead=1943, first_name="Sergey",
	last_name="Rakhmaninov"];;
roman::bizet/[born=1838, 
	dead=1875, first_name="Gerges",
	last_name="Bizet"];;
%# "contemporary" モジュールには、現代の作曲者のデータが
% 格納されています。
% born で、生まれた年を、dead で、死んだ年を、first_name で名を、
% middle_name で中間名を、last_name で姓を示します。
contemporary::debussy/[born=1862, 
	dead=1918, 
	first_name="Claude",
	middle_name="Achile",
	last_name="Debussy"];;
contemporary::ravel/[born=1875, 
	dead=1937, 
	first_name="Maurice",
	last_name="Ravel"];;
contemporary::satie/[born=1866, 
	dead=1925, 
	first_name="Eric",
	last_name="Satie"];;
contemporary::bartok/[born=1881, 
	dead=1945, 
	first_name="Bela",
	last_name="Bartok"];;
contemporary::schostakovisch/
	[born=1906, dead=1975, 
	first_name="Dmitri",
	last_name="Schostakovisch"];;
contemporary::prokofiev/
	[born=1891, dead=1953, 
	first_name="Sergey",
	last_name="Prokofiev"];;
contemporary::stravinsky/
	[born=1882, dead=1971, 
	first_name="Igor",
	last_name="Stravinsky"];;
contemporary::schonberg/
	[born=1874, dead=1951, 
	first_name="Arnold",
	last_name="Schonberg"];;
%# "listening" モジュールには、「聞く」ことに関することが
% 格納されています。
% 「長調の作品は、心地良くする。」「短調の作品は、気分を憂鬱にする。」
% を記述しています。
listening:: {
    cheerful[tune=X] <= 
	music:X/[key->major];;
    gloom[tune=X]    <= 
	music:X/[key->minor]
				};;
% 「気分が優れない時は、元気の出る作品がお勧め。」を記述しています。
listening:: 
     recommendation[for=A, piece=X]
     <= A/[feeling->gloom], 
        cheerful[tune=X] || 
	{A =< person};;
% 「bob の気分は、良くない。」「ken の気分はいい。」を記述しています。
listening::bob/[feeling=gloom];;
listening::ken/[feeling=fine];;
%# "sound" モジュールは、音のソースの情報を格納しています。
% sound は音のソースの在処とタイプを示します。
sound::k388/[sound = 
    sound[file="/home/qxt/snd/eine.au",
    type=au]];;
sound::k330/[sound = 
    sound[file="/home/qxt/snd/k330.au",
    type=au]];;
sound::op001[composer=satie]/
    [sound = 
       sound[file="/home/qxt/snd/gimno.au",
     type=au]];;
sound::op002[composer=satie]/
    [sound = 
       sound[file="/home/qxt/snd/satie2.au",
     type=au]];;
sound::bwv578/[sound = 
    sound[file="/home/qxt/snd/lfuga.au",
    type=au]];;
sound::bwv1068/[sound = 
    sound[file="/home/qxt/snd/gair.au",
    type=au]];;
sound::op001[composer=chopin]/[sound = 
     sound[file="/home/qxt/snd/noctrn.au",
     type=au]];;
%# "picture" モジュールは、絵のソースの情報を格納しています。
% picture は絵のソースの在処とタイプを示します。
picture::haydn/[picture = 
    pict[file="/home/qxt/pict/haydn.gif",
    type=gif]];;
picture::mozart/[picture = 
    pict[file="/home/qxt/pict/mozart.gif",
    type=gif]];;
picture::beethoven/[picture = 
    pict[file="/home/qxt/pict/beethoven.gif", 
    type=gif]];;
&end.
%# (1) 「古典作曲者の絵にはどのようなものがあるか?」
%       という問いは以下のように表されます。
?- composer:X/[picture=P],classic:X. 
% Quixote の答えは次の通りです。
[Answer]
database> ** 3 answers exist **
** Answer 1 **
    X == mozart, P == pict[type=gif,file="/home/qxt/pict/mozart.gif"]
** Answer 2 **
    X == beethoven, P == pict[type=gif,file="/home/qxt/pict/beethoven.gif"]
** Answer 3 **
    X == haydn, P == pict[type=gif,file="/home/qxt/pict/haydn.gif"]
% この答えから、データベースに格納されている古典作曲者の絵は3つで、
% そのソースの情報が分かります。
%# (2) 「モーツァルトが29歳の時に作曲した、ピアノを用いる曲は何か?」
% 	という問いは以下のように表されます。
?- music:X/[composer=mozart, type=T, 
     age_of_composer=29, 
     instruments* >* {piano}].
% Quixote の答えは次の通りです。
[Answer]
database> ** 3 answers exist **
** Answer 1 **
    X == k482, T == piano_concert
** Answer 2 **
    X == k467, T == piano_concert
** Answer 3 **
    X == k466, T == piano_concert
% この答から、モーツァルトは29歳の時に、3つのピアノ曲を作曲した
% ことが分かります。
%# (3) 「交響曲以外で、1778年にモーツァルトが作曲した作品には
%	 どのようなものがあるか?」
%	という問いは以下のように表されます。
?- music:Z/[composer=mozart, type=X, 
	sound=S, year=1778] ||
	{X=/=symphony}.
% Quixote の答えは次の通りです。
[Answer] 
database> ** 3 answers exist **
** Answer 1 **
    Z == k330, X == piano_sonata, S == sound[type=au,file="/home/qxt/snd/k330.au"]
** Answer 2 **
    Z == k301, X == violin_sonata, S == Unbound
** Answer 3 **
    Z == k331, X == piano_sonata, S == Unbound
database> 
% この答から、1778年にモーツァルトは交響曲以外に3つの曲を作曲していて、
% そのうち K330 は音がデータベースに格納されていることが分かります。
%# (4a) 「Bob にお勧めのモーツァルトの作品は何か?」
%	という問いは以下のように表されます。
% (bob.feeling == gloom)
?- listening:
    recommendation[for=bob, piece=M], 
    piece:M/[type = piano_concert, 
	no=N, year=Y,composer=mozart].
% Quixote の答えは次の通りです。
[Answer] 
database> ** 5 answers exist **
** Answer 1 **
 IF music:k466.key =< major THEN
    M == k466, N == 20, Y == 1785
** Answer 2 **
 IF music:k467.key =< major THEN
    M == k467, N == 21, Y == 1785
** Answer 3 **
    M == k482, N == 22, Y == 1785
** Answer 4 **
    M == k488, N == 23, Y == 1786
** Answer 5 **
    M == k503, N == 25, Y == 1786
% この答から、Bob にお勧めのモーツァルトの作品は、5つあることが
% 分かります。但しそのうち2つは、「長調なら」という仮定付き答え
% が返されています。
%# (4b) 「もし k466 が d短調で、k467 が C長調なら、Bob に
%	  お勧めのモーツァルトの作品は何か?」という、(4a) の
%	 質問に仮説を付けることもできます。この質問は Quixote 
%	では、以下のように表されます。
?- listening:
    recommendation[for=bob, piece=M], 
    piece:M/[type = piano_concert,
        year=Y,no=N,composer=mozart];;
    &program;; &rule;; 
	piece::k466/[key=dminor];; 
	piece::k467/[key=cmajor];; 
    &end.
% Quixote の答えは次の通りです。
[Answer]
database> ** 4 answers exist **
** Answer 1 **
    M == k467, Y == 1785, N == 21
** Answer 2 **
    M == k482, Y == 1785, N == 22
** Answer 3 **
    M == k488, Y == 1786, N == 23
** Answer 4 **
    M == k503, Y == 1786, N == 25
% この答から、Bob にお勧めの作品が4つあることが分かります。
%# (5) 「バッハかモーツァルトの作品で、アンサンブルの作品は何か?」
%	という問いは以下のように表されます。
?- music:X/[composer=C, type=ensemble, sound=S]
	|| {C &in {mozart,bach}}.
% Quixote の答えは次の通りです。
[Answer]
database> ** 2 answers exist **
** Answer 1 **
    X == k388, C == mozart, S == sound[type=au,file="/home/qxt/snd/eine.au"]
** Answer 2 **
    X == bwv1068, C == bach, S == sound[type=au,file="/home/qxt/snd/gair.au"]
% この答から、モーツァルトの作品は k388、バッハの作品は bwv1068 で
% あることが分かります。また、音が格納されていることも分かります。
%# (6) 「ヘンデルかバッハのオルガン曲は何か?」
%	という問いは以下のように表されます。
?- music:X/[composer=C,instruments* >* {organ},sound=S] || 
{C &in {handel, bach}}.
% Quixote の答えは次の通りです。
[Answer]
database> ** 2 answers exist **
** Answer 1 **
    X == bwv578, C == bach, S == sound[type=au,file="/home/qxt/snd/lfuga.au"]
** Answer 2 **
    X == op30[composer=handel], C == handel, S == Unbound
% この答から、バッハのオルガン曲は、bwv578 で、音もデータベースに
% 格納されているのが分かります。ヘンデルのオルガン曲は op30[composer=handel]
% ですが、音はデータベースに格納されていません。