Я пытаюсь использовать пролог для разработки простого 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, и я также не уверен, где это должно быть сделано. Можно ли связать вещи с правой стороны правила перезаписи?
Спасибо,
Шон
Большое спасибо за ваш ответ. Это именно то, что я ищу. Однако на данный момент я могу получить правильный ответ, загрузив свою грамматику и выполнив предлагаемый код из подсказки? -. Мне интересно, как я мог бы реализовать одно и то же в грамматике, чтобы примечание можно было представить как a, или a2 ... Извините Если это неясно. –
, чтобы вы хотели, чтобы новая грамматическая постановка вызывала заметки? note (X, q) -> {фраза (примечание (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom]. – DaveEdelstein
или создать новое правило грамматики note_q (X) -> {фраза (примечание (X), ListOut), atomic_list_concat (ListOut, Atom)}, [Atom]. извините, если я не выясню, что вы * должны делать, только то, что вы могли бы сделать. – DaveEdelstein