2

我正在尝试使用 prolog 为音乐环境开发一个简单的 DCG。

我通过以下方式定义了音符:

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

上面的“ton”和“sup”参数与音符所属的和弦有关。音符 a、d 和 f 属于 * ton *ic 和弦,音符 b、e 和 g 属于 * sup *ertonic 和弦(在 D 大调中)。

现在,我想介绍一个进一步的“音符”符号,它有两个参数——一个用于和弦,一个用于音符持续时间。例如,

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

我的问题在于 note(X),[2] 是一个列表 [a,2]。我需要它的形式 [a2]。

不使用变量 X 可以解决这个问题:

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

但是由于我的表示中有七个不同的和弦和七个不同的音符长度,这将涉及很多不必要的(我认为)代码。

我不确定如何连接 note(X) 和整数 2,我也不确定应该在哪里完成。是否可以在重写规则的右侧连接事物?

谢谢,

肖恩

4

1 回答 1

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.
于 2012-03-07T01:54:21.850 回答