2012-03-06 74 views
2

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

我在这样定义的音符:

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

的“吨”以上“SUP”参数是指其和弦的音符属于。的音符,d和f属于* * IC弦和音符B,E,和g属于* SUP * ertonic和弦(在d大调)。

现在,我想介绍一个另外的'note'符号,它带有两个参数 - 一个用于和弦,另一个用于音符持续时间。例如,

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

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

有可能通过不使用变量X来解决这个问题:

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

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

我不确定如何连接说明(X)和整数2,并且我也不能确定哪里应该这样做。是否有可能连接重写规则右侧的东西?

感谢,

肖恩

回答

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. 
+0

非常感谢您的回应。这正是我正在寻找的。但是,目前我只能通过加载我的语法并从?提示符运行您的建议代码来获得正确的响应。 我想知道我怎么能实现同样的事情在语法中,这样一记可以表示为一个或A2 ...... 对不起,如果这还不清楚。 – 2012-03-07 13:48:08

+0

所以你想要一个新的语法生产,调用注释? note(X,q) - > {phrase(note(X),ListOut),atomic_list_concat(ListOut,Atom)},[Atom]。 – DaveEdelstein 2012-03-08 12:25:41

+0

或创建一个新的语法规则note_q(X) - > {phrase(note(X),ListOut),atomic_list_concat(ListOut,Atom)},[Atom]。对不起,如果我不说明你应该*做什么,只是你可以做什么。 – DaveEdelstein 2012-03-08 12:27:13