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