Prolog-附加列表列表

时间:2016-01-07 14:39:27

标签: list prolog dcg

我的数据库遵循以下格式:

aminotodna (Amincoacid, [DNA sequence]).

以下是数据库中的一些示例:

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]).

一些氨基酸具有多个DNA序列。 这是我的问题,所以在给定的[d,c,e,f]氨基酸列表中,我如何将它们的DNA序列附加在一起并给出所有组合,因为有些序列具有多个序列。

如果只有两个,我可以做到,它只是

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

点击;会给出所有组合。

我已经厌倦了使用列表,但这是我的尝试,它没有用:

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

listamino(T).

2 个答案:

答案 0 :(得分:3)

在使用Prolog描述列表时,请始终考虑使用DCG表示法以方便和清晰。例如,使用您的示例的子集,我首先使用DCG规则来描述对应关系(请注意,我使用的名称在所有方向都有意义):

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

然后我再次使用DCG规则来描述这些列表的串联:

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

示例查询:

?- 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.

append/3,没有其他变量,没有其他参数,没有废话。使用

答案 1 :(得分:1)

您需要一个额外的参数来跟踪当前组合:

; 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).