我的数据库遵循以下格式:
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).
答案 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
,没有其他变量,没有其他参数,没有废话。使用dcg!
答案 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).