Объединение типов в DCG - PullRequest
2 голосов
/ 07 марта 2012

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

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

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

'ton' и 'Приведенные выше аргументы относятся к тому аккорду, к которому принадлежит нота.Ноты a, d и f относятся к аккорду * ton * ic, а ноты 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, и я также не уверен, где это должнобыть сделаноМожно ли объединить вещи в правой части правила перезаписи?

Спасибо,

Шон

1 Ответ

0 голосов
/ 07 марта 2012

SWI-Prolog имеет atomic_list_concat / 2 .Вы можете запустить свой исходный код, а затем запустить полученный список атомов через этот предикат, чтобы получить один атом в качестве вывода:

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