%Here the regular expression

%reg(L):-fsa_regex_atom_compile("[{'DT','PP$'}^ , ['RB'*, {'JJ','VVG'}+ ]^ , [{'NP','NN'}+ , 'POS']^, {['NP'*, 'NNS'] , 'NP'+ , 'NN'+}]",L).

reg(L):-fsa_regex_atom_compile("['OF'^, 'PDT'^, {'DT','PP$'}^ , 'JJ'^, 'CD'^, [{'RB','RBR','RBS'}*, {'JJ','JJR','JJS'}+]^,[{'NP','NPS','NN','NNS'}+ , 'POS']^, {['NN'*, 'NNS'] ,['NP'*, 'NPS'], 'NP'+,'NN'+}]",L).


tokenize(Start,End,Delta):-reg(fa(X,Y,Start,End,Delta,[])).

expansion(A,[H|T],C,Output,Akku):-append(Akku,[trans(A,H,C)],L),expansion(A,T,C,Output,L).
expansion(A,[H|[]],C,Output,Akku):-append(Akku,[trans(A,H,C)],Output).

expand([trans(A,B,C)|Tail],Output,Akku):-not(B=in(X)),append(Akku,[trans(A,B,C)],L),expand(Tail,Output,L).
expand([trans(A,B,C)|[]],Output,Akku):-not(B=in(X)),append(Akku,[trans(A,B,C)],Output).

expand([trans(A,in(X),C)|Tail],Output,Akku):-expansion(A,X,C,Y,[]),append(Akku,Y,Z),expand(Tail,Output,Z).
expand([trans(A,in(X),C)|[]],Output,Akku):-expansion(A,X,C,Y,[]),append(Akku,Y,Output).

deltas([Delta|Tail],Output,Akku):-Delta=trans(A,B,C),append(Akku,[A],D),append(D,[B],E),append(E,[C],F),deltas(Tail, Output, F).

deltas([Delta|[]],Output,Akku):-Delta=trans(A,B,C),append(Akku,[A],D),append(D,[B],E),append(E,[C],Output).

getDeltas(X):-tokenize(Start,End,Delta),expand(Delta,Y,[]),deltas(Y,X,[]).

printlist([Head|Tail],Fd):-write(Fd,Head), nl(Fd),printlist(Tail, Fd).
printlist([Head|[]],Fd):-write(Fd,Head),nl(Fd).

%That's the predicate you want for writing the whole automathon the file 'auto'.
outputAuto:-tokenize(Start,End,Delta),open(auto,write,Fd),write(Fd,'Start'),nl(Fd),printlist(Start,Fd),write(Fd,'End'),nl(Fd),printlist(End,Fd),write(Fd,'Deltas:'),nl(Fd),getDeltas(X),printlist(X,Fd),close(Fd).
