2012-03-06 76 views
2

我正在嘗試使用prolog爲音樂環境開發一個簡單的DCG。在DCG中連接類型

我在這樣定義的音符:

note(ton) --> [a];[d];[f]. 
note(sup) --> [b];[e];[g]. 
etc. 

的「噸」以上「SUP」參數是指其和絃的音符屬於。的音符,d和f屬於* * IC弦和音符B,E,和g屬於* SUP * ertonic和絃(在d大調)。

現在,我想介紹一個另外的'note'符號,它帶有兩個參數 - 一個用於和絃,另一個用於音符持續時間。例如,

note(X,q) --> note(X),[2]. 

我的問題在於note(X),[2]是列表[a,2]。 我需要它的形式[a2]。

有可能通過不使用變量X來解決這個問題:

note(ton) --> [a];[d];[f]. 
note(ton,q) --> [a2];[d2];[f2]. 

但由於有七個不同的和絃,在我的代表七個不同的音符長度,這將涉及到很多不必要的(我認爲)代碼。

我不確定如何連接說明(X)和整數2,並且我也不能確定哪裏應該這樣做。是否有可能連接重寫規則右側的東西?

感謝,

肖恩

回答

0

SWI-Prolog有atomic_list_concat/2。您可以運行您的原始代碼,然後通過此謂詞運行您的結果原子列表以獲得單個原子作爲輸出:

?- X=ton, phrase(note(X, q), ListOut), atomic_list_concat(ListOut, Atom). 
Atom = a2 ; 
Atom = d2 ; 
Atom = f2. 
+0

非常感謝您的迴應。這正是我正在尋找的。但是,目前我只能通過加載我的語法並從?提示符運行您的建議代碼來獲得正確的響應。 我想知道我怎麼能實現同樣的事情在語法中,這樣一記可以表示爲一個或A2 ...... 對不起,如果這還不清楚。 – 2012-03-07 13:48:08

+0

所以你想要一個新的語法生產,調用註釋? note(X,q) - > {phrase(note(X),ListOut),atomic_list_concat(ListOut,Atom)},[Atom]。 – DaveEdelstein 2012-03-08 12:25:41

+0

或創建一個新的語法規則note_q(X) - > {phrase(note(X),ListOut),atomic_list_concat(ListOut,Atom)},[Atom]。對不起,如果我不說明你應該*做什麼,只是你可以做什麼。 – DaveEdelstein 2012-03-08 12:27:13