これが 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] % ですが、音はデータベースに格納されていません。