3

次の DCG を PROLOG の通常の限定節にどのように翻訳しますか?

expr_regular --> cor_ini,numero,guion,numero,cor_fin.
cor_ini --> ['['].
numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
cor_fin --> [']'].
guion --> ['-'].

編集: DCG を通常の PROLOG 句に変換したいのは、同じコードで DCG と通常の句の両方を使用できないためです (私の場合)。私はこの2つのコードを持っています:

ピース1:

traducir(Xs, Ys) :- maplist(traduccion, Xs, Ys).
traduccion('^',comeza_por).
traduccion('[',inicio_rango).
traduccion('0',cero).
traduccion('-',a).
traduccion('9',nove).
traduccion(']',fin_rango).

使用方法の例は次のとおりです。

?- traducir(['[','0','-','9',']'],[]).
true .

そしてPiece2:

 traducir--> cor_ini,numero,guion,numero,cor_fin.
 cor_ini --> ['['].
 numero --> ['0'];['1'];['2'];['3'];['4'];['5'];['6'];['7'];['8'];['9'].
 cor_fin --> [']'].
 guion --> ['-'].

使用方法の例は次のとおりです。

traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].

両方のコードを 1 つに結合して、traducir が適切に記述されているかどうか (DCG に従っている場合) をテストし、入力した内容をテキストに変換したいので、最終的なプログラムは次のことを実行できるはずです。

?- traducir(['^','[','0','-','9',']'],X).
X = [comeza_por, inicio_rango, cero, a, nove, fin_rango].
?- traducir(['[','0','-','9',']'],[]).
true .
4

3 に答える 3

2

listing/1で直接使用できます。

?- forall(member(NT,[expr_regular//0,cor_ini//0,numero//0,cor_fin//0,guion//0]),
          listing(NT)).
expr_regular(A, F) :-
    cor_ini(A, B),
    numero(B, C),
    guion(C, D),
    numero(D, E),
    cor_fin(E, F).

cor_ini(['['|A], A).

numero(A, B) :-
    (   A=['0'|B]
    ;   A=['1'|B]
    ;   A=['2'|B]
    ;   A=['3'|B]
    ;   A=['4'|B]
    ;   A=['5'|B]
    ;   A=['6'|B]
    ;   A=['7'|B]
    ;   A=['8'|B]
    ;   A=['9'|B]
    ).

cor_fin([']'|A], A).

guion([-|A], A).

true.

それでおしまい!「 Prolog で DCG を通常の限定節に変換する方法またはアルゴリズムはありますか? 」という関連する質問の回答を見ることで利益を得ることができます。

于 2015-06-26T07:01:33.460 に答える
1

さて、私は本当にあなたの質問をしません。とにかく、何らかの理由で優れたDCG構文を使用したくない場合でも、wildcard_match/2などを使用するか、車輪の再発明を行い、差分リストを使用してDCGを再実装するか、追加することができます。一部の場合wildcard_match/2

expr_regular(R) :- wildcard_match('[[][0-9]-[0-9]]', R).
于 2011-12-04T17:04:53.210 に答える
1

あなたの文法は非常に単純です: ターミナルだけです。したがって、非常に具体的なパターンに変換できます (注意: 一般化は許可されていません)。

expr_regular(S, G) :-
    S = [0'[, N1, 0'-, N2, 0']|G], numero(N1), numero(N2).
numero(N) :-
    memberchk(N, "0123456789").

ISO標準の文字表記であることに注意する価値があると思うだけです...

于 2011-12-04T20:15:20.447 に答える