我正在尝试使用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'符号,它带有两个参数 - 一个用于和弦,一个用于音符持续时间。例如,
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 :(得分: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.