在DCG中连接类型

时间:2012-03-06 23:35:36

标签: prolog concatenation dcg

我正在尝试使用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,我也不确定应该在哪里完成。是否有可能在重写规则的右侧连接事物?

谢谢,

肖恩

1 个答案:

答案 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.