/** uniqueremainders1(Divisor,Values,UniqueRemainders) For a chord progression (Values), finds the unique intervals between consecutive base notes (Remainders1). Where a (the dividend) and n (the divisor) are in a mod n. For: versechorussoloprogression('C','D'). [[C,D]] ?- uniqueremainders1(12,[0,2],UniqueRemainders). UniqueRemainders = [2]. For: versechorussoloprogression('C','D'). [[C,G,D]] ?- uniqueremainders1(12,[0,7,2],UniqueRemainders). UniqueRemainders = [7]. For: versechorussoloprogression('C','E'). [[C,D,E]] ?- uniqueremainders1(12,[0,2,4],UniqueRemainders). UniqueRemainders = [2]. For: versechorussoloprogression('C','E'). [[C,D,A,E]] ?- uniqueremainders1(12,[0,2,9,4],UniqueRemainders). UniqueRemainders = [2, 7] For: versechorussoloprogression('C','E'). [[C,G,A,E]] ?- uniqueremainders1(12,[0,7,9,4],UniqueRemainders). UniqueRemainders = [7, 2] For: versechorussoloprogression('C','E'). [[C,G,D,E]] ?- uniqueremainders1(12,[0,7,2,4],UniqueRemainders). UniqueRemainders = [7, 2] For: versechorussoloprogression('C','E'). [[C,G#,E]] ?- uniqueremainders1(12,[0,8,4],UniqueRemainders). UniqueRemainders = [8] For: versechorussoloprogression('C','D#'). [[C,G,D#]] ?- uniqueremainders1(12,[0,7,3],UniqueRemainders). UniqueRemainders = [7, 8] For: versechorussoloprogression('C','D#'). [[C,G#,D#]] ?- uniqueremainders1(12,[0,8,3],UniqueRemainders). UniqueRemainders = [8, 7] **/ uniqueremainders1(Divisor,Values1,UniqueRemainders) :- Values1=[Value|Values2], uniqueremainders2(Divisor,Value,Values2,[],Remainders1), Remainders1=[Remainder|Remainders2], unique1(Remainders2,Remainder,[],UniqueRemainders). uniqueremainders2(_Divisor,_Value,[],Remainders,Remainders) :- !. uniqueremainders2(Divisor,Value1,Values1,Remainders1,Remainders2) :- Values1=[Value2|Values2], Dividend is Value2-Value1, Remainder is Dividend mod Divisor, append(Remainders1,[Remainder],Remainders3), uniqueremainders2(Divisor,Value2,Values2,Remainders3,Remainders2). %% unique1(Remainders,Remainder,UniqueRemainders1,UniqueRemainders2) %% Given the initial list of UniqueRemainders1, the first Remainder and the other Remainders, returns the remainders that are unique (UniqueRemainders2). unique1(_Remainders,[],UniqueRemainders,UniqueRemainders) :- !. unique1(Remainders1,Remainder,UniqueRemainders1,UniqueRemainders2) :- delete(Remainders1,Remainder,Remainders2), append([Remainder],Remainders2,Remainders3), unique2(Remainders3,Remainders4,Remainders5,UniqueRemainders1,UniqueRemainders3), unique1(Remainders5,Remainders4,UniqueRemainders3,UniqueRemainders2). unique2(Remainders1,Remainder1,Remainders2,UniqueRemainders1,UniqueRemainders2) :- Remainders1=[Remainder2,Remainder1|Remainders2], append(UniqueRemainders1,[Remainder2],UniqueRemainders2). unique2(Remainders1,_Remainder1,Remainder2,UniqueRemainders1,UniqueRemainders2) :- Remainders1=[Remainder2], append(UniqueRemainders1,[Remainder2],UniqueRemainders2).