/** Counter=2 ?- trace, chorussoloprogression('C','D'). [C, D] Yes Counter=3 ?- chorussoloprogression('C','G'). [[C, D, G], [C, F, G]] Yes **/ chorussoloprogression(Name1, Name2) :- note(Note1, Name1), note(Note2, Name2), chorussoloprogression(Note1, Note2, 0, _, [Note1], Progression1), notestonames(Progression1,Progression2), writeln(Progression2). chorussoloprogression(_, _, Counter, b, Progression, Progression) :- Counter = 5, !. chorussoloprogression(Note, Note, _Counter, a, Progression, Progression) :- !. chorussoloprogression(Note1, Note2, Counter1, Flag1, Progression1, Progression2) :- Counter2 is Counter1 + 1, step1(Note1, Note3), append(Progression1, [Note3], Progression3), chorussoloprogression(Note3, Note2, Counter2, Flag2, Progression3, Progression4), step2(Note1, Note4), append(Progression1, [Note4], Progression5), chorussoloprogression(Note4, Note2, Counter2, Flag3, Progression5, Progression6), flag(Flag2, Progression4, Flag3, Progression6, Flag1, Progression2). step1(Note1, Note2) :- Value is Note1+2, Note2 is Value mod 11. step2(Note1, Note2) :- Value is Note1+5, Note2 is Value mod 11. notestonames(Progression1, Progression2) :- notestonames1(Progression1, [], Progression2). notestonames1([],P2,P2). notestonames1([P|Progression1], Progression2, Progression3) :- notestonames2(P, [], Progression4), append(Progression2, [Progression4], Progression5), notestonames1(Progression1, Progression5, Progression3). notestonames2([], Progression2, Progression2). notestonames2([P1|Progression1], Progression2, Progression3) :- note(P1,Name),append(Progression2,[Name],Progression4), notestonames2(Progression1, Progression4, Progression3). flag(a,Progression1,a,Progression2,a,[Progression1,Progression2]) :- !. flag(a,Progression1,_,_Progression2,a,Progression1) :- !. flag(_,_Progression1,a,Progression2,a,Progression2) :- !. flag(_,_,_,_,b,[]). note(0,'C'). note(1,'C#'). note(2,'D'). note(3,'D#'). note(4,'E'). note(5,'F'). note(6,'F#'). note(7,'G'). note(8,'G#'). note(9,'A'). note(10,'A#'). note(11,'B').