5

phrase_from_file文法規則を使用して整数行を含むファイルを解析しようとしています

line --> I,line,{integer(I)}.
line --> ['\n'].

したがって:phrase_from_file(line,'input.txt').

それは失敗し、私はそれを追跡しようとするとすぐに迷子になりました。印刷しようとしたIのですが、うまくいきません。

編集::以下の解決策はどれも私のニーズに本当に合わないので(read/1用語を読んでいると仮定し、DCGを書くのに時間がかかりすぎる場合があります)、グーグルでこのコードを共食いしました。主な変更点は次のとおりです。

read_rest(-1,[]):-!.

read_word(C,[],C) :- ( C=32 ;
                       C=(-1)
                     ) , !.
4

2 に答える 2

5

使用している場合phrase_from_file/2は、実際のファイルを読み取る前にプログラムをテストする非常に簡単な方法があります。まったく同じ非終端記号を。で呼び出すだけphrase/2です。したがって、目標

phrase(line,"1\n2").

呼び出すのと同じです

phrase_from_file(line,fichier)

fichierが3文字を超えるファイルの場合。したがって、を使用して非常にコンパクトな方法でテストと実験を行うことができますphrase/2

すでに述べた@JanBurseにはさらに問題があります。SWIは文字コードを読み込みます。だからあなたは書く必要があります

newline --> "\n".

改行のために。そして、あなたはまだあなた自身で整数を解析しなければなりません。しかし、これらはすべて、を使用するとはるかに簡単にテストされphrase/2ます。良い点は、実際のDCGコードを変更せずにファイルの読み取りに切り替えることができることです。

于 2011-07-26T12:11:53.440 に答える
4

ここには概念的な問題があると思います。phrase_from_file / 2の詳細、つまり使用しているPrologシステムはわかりませんが、それでも文字コードが生成されると思います。したがって、ファイル内の整数123の場合、文字コード0'1、0'2、および0'3を取得します。これはおそらくあなたが望むものではありません。

文字を処理する場合は、ベアボーン変数Iの代わりに非終端記号を使用して文字をフェッチする必要があります。そして、整数テストの代わりに、性格テストが必要になり、より早くテストを行うことができます:

line --> [I], {0'0=<I, I=<0'9}, line.

よろしくお願いします

PS:DCGの方法を使用する代わりに、用語読み取り操作を使用することもできます。参照: プロローグおよびソートでファイルから番号を読み取る

于 2011-07-26T10:08:38.260 に答える