/** output from energy.pl gives notes for local minima and maxima 878 -+ 87678 --++ changes_to_music(Changes,Music) :- changes_to_music1(Changes,[],d,Music1), find_minima_and_maxima(Changes,Music1,Music). **/ %% ?- changes_to_music([+,+,-,-],Music). %% Music = [c, d, e, d, c] ; %% changes_to_music(Changes,Music) %% Changes - List of +'s or -'s, indicating whether a note should %% go up or down from the last one, respectively. %% Music - List of notes changes_to_music(Changes,Music) :- changes_to_music1(Changes,[],c,Music). %% changes_to_music1(Changes,Music1,Music2,Music3) %% Changes - as for changes_to_music/2 %% Music1 - Current list of notes %% Music2 - Next note %% Music3 - List of notes changes_to_music1([],Music,Music1,Music2) :- append(Music,[Music1],Music2). changes_to_music1([+|Changes],Music1,Music2,Music3) :- music(Music2,Music4), changes_to_music2(Music1,Music2,Changes,Music4,Music3). changes_to_music1([-|Changes],Music1,Music2,Music3) :- music(Music4,Music2), changes_to_music2(Music1,Music2,Changes,Music4,Music3). %% changes_to_music2(Music1,Music2,Changes,Music3,Music4) %% Music1, Music2, Changes - as for changes_to_music1/4 %% Music3 - Next note %% Music4 - List of notes changes_to_music2(Music1,Music2,Changes,Music3,Music4) :- append(Music1,[Music2],Music5), changes_to_music1(Changes,Music5,Music3,Music4). %% music(Note,NextNote) %% Note - First note %% NextNote - Note about the first note music(b,c). music(c,d). music(d,e). music(e,f). music(f,g). music(g,a). music(a,b). %% ?- find_minima_and_maxima([+,+,-,-], [c, d, e, d, c], Music). %% Music = [c, e, c] ; %% find_minima_and_maxima(Changes,Music1,Music2). %% Changes - List of +'s or -'s, indicating whether a note should %% go up or down from the last one, respectively. %% Music1 - List of notes %% Music2 - List of notes which are minima and maxima of Music1 find_minima_and_maxima([Change1|Changes],[Note1,Note2|Music1],Music2) :- find_minima_and_maxima1(Changes,Music1,Change1,Note2,[Note1],Music2). %% find_minima_and_maxima1(Changes,Music1,Change,Note2,Note1,Music2). %% Changes - as for find_minima_and_maxima/3 %% Music1 - rest of music %% Change - '+' - go up a note %% '-' - go down a note %% Note2 - second note %% Note1 - first note %% Music2 - list of notes find_minima_and_maxima1([],[],_,Note1,Music1,Music2) :- append(Music1,[Note1],Music2). find_minima_and_maxima1([Change1|Changes],[Note1|Music1],Change1,_,Music2,Music3) :- find_minima_and_maxima1(Changes,Music1,Change1,Note1,Music2,Music3). find_minima_and_maxima1([Change1|Changes],[Note1|Music1],Change2,Note2,Music2,Music3) :- not(Change1=Change2), append(Music2,[Note2],Music4), find_minima_and_maxima1(Changes,Music1,Change1,Note1,Music4,Music3).