seq([]) -->
    [].
seq([C|Cs]) -->
    [C],
    seq(Cs).

:- phrase(seq([1,2,3,4]),Xs), Xs = [1,2,3,4].  
:- phrase(seq(`abcd`),`abcd`).

invseq([]) -->
    [].
invseq([C|Cs]) -->
    invseq(Cs),
    [C].

:- phrase(invseq(`abcd`),Xs), Xs=`dcba`.

palindrom -->
    seq(Xs),
    invseq(Xs).
palindrom -->
    seq(Xs),
    [_],
    invseq(Xs). 

:- phrase(palindrom,`abba`).

palindrom2 -->
    [].
palindrom2 -->
    [_].
palindrom2 -->
    [X],
    palindrom2,
    [X].

:- phrase(palindrom2,`abba`).

genom(Cs) :-
    Cs = `ATAGTCTAGTGATGAGTATGGCAAAGAGGTCAACCCGTTCCATACCGAACACGGAAGTTAAGCTCTTTAGCGCCGATGGTAGTTGGGGGCTTCCCCCTGTGAGAGTAGGACGTCGCTAGGCATAATACCAGGAGGATTAGCTCAGCTGGGAGAGCATCTGCCTTACAAGCAGAGGGTGGCGGTTCGAGCCGCGCCATCCTCCACCATATGCCGGTTTAGCTCAGCAGGTAGAGCAACTGACTTGTAATCAGTAGGTCGTGGGTTCGATTCCTATAGCCGGCACCATTTTTTTCGAGCCATAGCTCAGTTGGTAGAGCATCTGACTTTTAATCAGAGGGTCGAAGGTTCGAGTCCTTCATGGCTCACCATTATAAATAATAATAATAAGCGGTGTGGAATTGGCAGACGCACTAACTTAGGATCTACCGCCGCAAGGCGTGGGGCTCGACTCCCTGACCGCACCATTATTTTCATTGCCAGATAAAAAA`.
    
base -->
    "A".
base -->
    "C".
base -->
    "G".
base -->
    "T".

basen -->
    "".
basen -->
    base,
    basen.  

:- genom(Cs), phrase(basen,Cs).

tandemrepeat(Alpha) -->
    seq(Alpha),
    seq(Alpha),
    {dif(Alpha,[])}.

:- phrase(tandemrepeat(Xs),`ACTACT`), Xs = `ACT`.
:- \+ phrase(tandemrepeat([]), _Bs).
:- \+ phrase(tandemrepeat(``),``).

subseq_tandemrepeat(Alpha) -->
    seq(_Prefix),
    tandemrepeat(Alpha),
    seq(_Suffix).

:- genom(Genom), phrase(subseq_tandemrepeat(Alpha),Genom), Alpha=`TGA`.
:- genom(Genom), phrase(subseq_tandemrepeat(Alpha),Genom), \+ length(Alpha,4).