プログラミング言語Prolog。「論理を使ったプログラミング」を意味するフランス語「programmation en logique」に由来している、とウィキペディアにあります。
https://ja.wikipedia.org/wiki/Prolog
述語論理とか論理プログラムという言葉が出てきますが、関係性を記述して作られたグラフ構造を探索して、結果を表示したりできます。
LISP言語でもできると思いますが、述語論理というだけあってか、文章を書く感覚に近い気がします。
(以前どこかで同様の記事を書いた気がしますが・・)
下記サイトを参考に、音楽のコード進行のパターンを探索してみました。
http://bach.istc.kobe-u.ac.jp/prolog/intro/search.html
環境: Ubuntu 18.04
chord_progression.pl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
arc(p1, 'C7', 'Fmaj7'). arc(p2, 'Fmaj7', 'G7'). arc(p3, 'G7', 'Cmaj7'). arc(p4, 'Am7', 'Dm7'). arc(p5, 'E7', 'Am7'). arc(p6, 'Cmaj7', 'Am7'). arc(p7, 'Bm7-5', 'E7'). arc(p7, 'Am7', 'Gm7'). arc(p8, 'Gm7', 'C7'). arc(p9, 'Cmaj7', 'Bm7-5'). arc(p10, 'Dm7', 'G7'). arc(p11, 'G7', 'Cmaj'). arc(p12, 'Db7', 'Cmaj'). arc(p13, 'Dm7', 'Db7'). walk(U, U). walk(U, V) :- arc(_, U, U1), walk(U1, V). path(U, U, _, []). path(U, V, L, [U|P]) :- arc(A, U, U1), \+ member(U1, L), path(U1, V, [U1|L], P). path_find(U, V, P) :- path(U, V, [U], P). |
[]はリストを表し、再帰でループしたり、このあたりLISP的です。
swipl chord_progression.pl
で起動。
探索結果が複数ある場合は、セミコロンで次のパターンを表示できます。
なくなったところで、falseが表示されます。
結構実用的な結果になりました。このコード進行使えますね。