2

プロローグを使用して、音楽のコンテキスト用の単純な DCG を開発しようとしています。

私は次のように音符を定義しました。

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

上記の 'ton' および 'sup' 引数は、音符が属するコードに関連しています。ノート a、d、および f は * ton * ic コードに属し、ノート b、e、および g は * sup *ertonic コードに属します (ニ長調の調)。

ここで、2 つの引数 (1 つは和音用、もう 1 つは音符の長さ) を取る「音符」記号をさらに導入したいと思います。例えば、

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

私の問題は、note(X),[2] がリスト [a,2] であるという事実にあります。[a2] の形式で必要です。

変数 X を使用しないことで、この問題を回避することができます。

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

しかし、私の表現には 7 つの異なるコードと 7 つの異なる音符の長さがあるため、これには多くの不要な (私が思うに) コードが含まれます。

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 に答える