%% Append Program Finder /** %%o([a,b,c],[d,e,f],[[a,d],[b,e],[c,f]]). o(A,B,C) :- o(A,B,[],C). o([],[],C,C). o(A,B,C,C1):- A=[A1|As],B=[B1|Bs], append([A1],[B1],AB), append(C,[AB],C3), o(As,Bs,C3,C1). **/ %% apf1([[1,2,3],[4,5,6],[7,8,9]],[[1,4,7],[2,5,8],[3,6,9]],Program) apf1(Input,Output,Program) :- apf(Input,Output,[],Indices), list_checker1(Indices), Program=[[o(v(a),v(b),v(c)), o(v(a),v(b),[],v(c))], [o([],[],v(c),v(c))], [o(v(a),v(b),v(c),v(c1)), v(a)=[v(a1)|v(as)],v(b)=[v(b1)|v(bs)], append([v(a1)],[v(b1)],v(ab)), append(v(c),[v(ab)],v(c3)), o(v(as),v(bs),v(c3),v(c1))]]. apf(_Input, [], Indices, Indices). apf(Input, Output, Indices1,Indices2) :- Output = [Item1 | Items2], findindex1(Item1, Input, Index), append(Indices1,[Index],Indices3), apf(Input,Items2,Indices3,Indices2). findindex1([], _Input, _Index). findindex1(Item, Input, Index) :- Item = [Value1 | Values], findindexa(Value1, Input, 1, Index), findindex1(Values, Input, Index). findindexa(_Value,[],Index,Index). findindexa(Value,Input,Index1,Index2) :- Input = [Item1 | Items], length(Item1,Length1),Length2 is Length1 + 1, findindex2(Value,Item1,Index1,Index3), findindexb(Value,Items,Index3,Index2,Length2). findindexb(Value,Item,Length,Index1,Length) :- %%ifindindex2(Value,Item,1,Index2), %%findindexa(Value,Item,Index2,Index1). findindexa(Value,Item,1,Index1),!. findindexb(Value,_Item,Index1,Index2,_Length) :- findindexa(Value,[],Index1,Index2). findindex2(Value, Input, Index, Index) :- Input = [Value | _Values], !. findindex2(_Value, [], Index, Index). findindex2(Value1, Input, CurrIndex1, Index) :- Input = [Value2 | Values], not(Value1 = Value2), CurrIndex2 is CurrIndex1 + 1, findindex2(Value1, Values, CurrIndex2, Index). list_checker1(List) :- List = [Item | Items], list_checker2(Item, Items). list_checker2(_Item, []). list_checker2(Item1, List) :- List = [Item2 | Items], Item2 is Item1 + 1, list_checker2(Item2, Items).