/***** Formula Finder ?- formulafinder(A). A = v=a*t+u ; No *****/ variables(v,[u,a,t,w]). %%data([[2,[0,1,2]],[7,[5,1,2]],[1,[0.875,0.5,0.25]]]). data([[4,[0,1,2,2]],[9,[5,1,2,2]],[3,[0.875,0.5,0.25,2]]]). formulafinder(A) :- data([[Result,List]|Data]),ff2(Result,List,A), testdata1(Data,A),!. testdata1([],_). testdata1([[Result,List]|Data],A) :- ff2(Result,List,A), testdata1(Data,A). ff2(Result,List,VA1) :- variables(VResult,VList), num(Number), argdel(Number,List,L,List1), argdel(Number,VList,VL,VList1), %%arg(Number,VList,VL),delete(VList,VL,VList1), ff(List1,L,A,VList1,VL,VA), Result is A, VA1=(VResult=VA). argdel(_,[],_L1,_L2). argdel(Number,List,L,List1) :- Number1 is Number-1,length(A,Number1),append(A,B,List),append([L],_,B), length(List,Listlen),Number2 is Listlen-(Number1+1),length(C,Number2), append(_,C,List),append(A,C,List1). num(1). num(2). num(3). num(4). num(5). testdata(Result,List) :- num(Number),data(Setlist), Number1 is Number-1, length(A,Number1),append(A,B,Setlist),append([[Result,List]],_,B). ff([],A,A,[],VA,VA) :- !. ff(List1,A1,A,VList1,VA1,VA) :- num(Number), argdel(Number,List1,L2,List2), argdel(Number,VList1,VL2,VList2), operate(A1,L2,A2,VA1,VL2,VA2), ff(List2,A2,A,VList2,VA2,VA). /**ff(List1,A1,A,VList1,VA1,VA) :- num(Number), argdel(Number,List1,L2,List2), argdel(Number,VList1,VL2,VList2), operate(L2,A1,A2,VA1,VL2,VA2), ff(List2,A2,A,VList2,VA2,VA).**/ operate(A,B,A+B,C,D,C+D). operate(A,B,B-A,C,D,D-C). operate(A,B,A*B,C,D,C*D). %% 2p %% construct([1,2,4,5],Formula) %% Formula = (4*5)-(1+2) %% construct(List1,_Formula,Item1,Item2) :- delete(List1,Item1,List2), delete(List2,Item2,_List3). %%generatekeys(3,[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]). generatekeys(List1,List2,List3) :- generatekeys(List1,[],List4), reverse reverse([],List,List). reverse([Item|List1],List2,List3) :- append([Item],List2,List4), %% keep partially reversed lists reverse(List1,List4,List3). %% construct(1,[2,1],L1 construct(List1,Item1,List2,List3) :- traverse(List1,Item1,List2,List3). traverse([Item1,_Operator,Item2],Item3,List1,List2) :- traverse(Item1,Item3,List1,List3) %%,append(, traverse(Item2,Item3,List3,List2). traverse([Item1],Item2,List1,List2) :- operate1(Item1,Item2,Item3,Operator,Item4), append(List1,[Item3,Operator,Item4],List2). operate1(Item1,Item2,Item1,Operator,Item2) :- operator1(Operator). operate1(Item1,Item2,Item1,-,Item2) :- operator2(Operator), divbyzerocheck(Item2,Operator). operate1(Item1,Item2,Item2,Operator,Item1) :- operator2(Operator), divbyzerocheck(Item1,Operator). operator1(+). operator1(*). operator2(-). operator2(/). divbyzerocheck(0,/) :- fail, !. divbyzerocheck(_,_).