FProlog
FProlog

Reputation: 173

Prolog- Appending a list of lists

My database follows this format:

aminotodna (Amincoacid, [DNA sequence]).

Here are a few examples from the database:

aminotodna(a,[g,c,a]).
aminotodna(a,[g,c,c]).
aminotodna(a,[g,c,g]).
aminotodna(a,[g,c,t]).
aminotodna(c,[t,g,c]).
aminotodna(c,[t,g,t]).
aminotodna(d,[g,a,c]).
aminotodna(d,[g,a,t]).
aminotodna(e,[g,a,a]).
aminotodna(e,[g,a,g]).
aminotodna(f,[t,t,c]).
aminotodna(f,[t,t,t]).

Some aminoacids have multiple DNA sequences. Here is my question, so in a given list of amino acids for example [d,c,e,f], how can I append their DNA sequences together and give all combinations, as some have more than one sequence.

If it was just two I could do it, it'd just be

listamino(X,Y) :-
    aminotodna(X,L),
    aminotodna(Y,M),
    append(L,M,Z),
    print(Z).

hitting ; gives all combinations.

I've tired doing it with a list, but this is my attempt, and it didnt work:

listamino([]).
listamino([H|T]) :-
    aminotodna(H,L),
    aminotodna(T,M),
    append(L,M,X),
    print(X).

listamino(T).

Upvotes: 3

Views: 247

Answers (2)

Scott Hunter
Scott Hunter

Reputation: 49803

You need an extra parameter to keep track of the current combination:

; invoke a version of listamino which tracks the current combination of DNA sequences, which is initially empty
listamino(X) :-
    listamino(X,[]). 

; If there are no ore aminos, print the DNA seq list, and we're done 
listamino([],X) :-
    print(X).

; Otherwise, append the DNA for the first amino to our list, and process the rest of the mains
listamino([H|T],X) :-
    aminotodna(H,L),
    append(X,L,X2),
    listamino(T,X2).

Upvotes: 1

mat
mat

Reputation: 40768

When describing lists with Prolog, always consider using DCG notation for convenience and clarity. For example, using a subset of your examples, I first use DCG rules to describe the correspondence (note that I am using a name that makes sense in all directions):

amino_dna(a) --> [g,c,a].
amino_dna(a) --> [g,c,c].
amino_dna(c) --> [t,g,c].
amino_dna(c) --> [t,g,t].

an then I again use DCG rules to describe the concatenation of such lists:

aminos([]) --> [].
aminos([A|As]) --> amino_dna(A), aminos(As).

Sample query:

?- phrase(aminos([a,c]), As).
As = [g, c, a, t, g, c] ;
As = [g, c, a, t, g, t] ;
As = [g, c, c, t, g, c] ;
etc.

No append/3, no additional variables, no additional arguments, no nonsense. Use !

Upvotes: 3

Related Questions