2016-01-07 112 views
3

我的數據庫的格式如下:Prolog-追加列表的列表

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

您能根據您的樣本數據給出您想要的行爲示例嗎? –

+0

@ScottHunter所以,如果我寫了listamino([a,c,e])。它會附加DNA序列,所以結果將是[g,c,a,t,g,c,g,a,a]和其他所有組合。 – FProlog

+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). 
+0

謝謝,這工作。但是如果你可以澄清哪個參數跟蹤當前的組合? – FProlog

+0

我加了一個;打印的那個;第二個。 –

+0

我真的很難理解這一點。什麼是'listamino(X): - listamino(X,[])。 「在做什麼?爲什麼listamino([H | T],X)中的列表後面有一個X? – FProlog

2

使用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,沒有額外的變量,沒有額外的參數,no廢話。使用