2012-03-06 3 views
2

Я пытаюсь использовать пролог для разработки простого DCG для музыкального контекста.Типы конкатенации в DCG

Я определил музыкальные ноты следующим образом:

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

«т» и аргументы «» SUP выше, относятся к которым аккорд примечание принадлежит. Примечания a, d и f относятся к * аккорду и нотам b, e и g относятся к * sup * ертонический аккорд (в ключе мажор).

Теперь я хочу ввести еще один символ «примечания», который принимает два аргумента: один для аккорда и один для продолжительности ноты. Например,

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

Моя проблема заключается в том, что примечание (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

Большое спасибо за ваш ответ. Это именно то, что я ищу. Однако на данный момент я могу получить правильный ответ, загрузив свою грамматику и выполнив предлагаемый код из подсказки? -. Мне интересно, как я мог бы реализовать одно и то же в грамматике, чтобы примечание можно было представить как a, или a2 ... Извините Если это неясно. –

+0

, чтобы вы хотели, чтобы новая грамматическая постановка вызывала заметки? note (X, q) -> {фраза (примечание (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom]. – DaveEdelstein

+0

или создать новое правило грамматики note_q (X) -> {фраза (примечание (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom]. извините, если я не выясню, что вы * должны делать, только то, что вы могли бы сделать. – DaveEdelstein

Смежные вопросы