3

私は単語計算機をしようとしています..ファイルから単語を読みます..それらを数字に翻訳してから結果を計算します..私はそれをすべて行うことができましたが、私のプログラムには2つのバグがあると思います..

私は主に2つの機能を持っています...

extract(Words)、calculate(Words、0)。

extractはファイルから読み取り、単語のリストを返します..例:[one、plus、three] ..ここで、calculateはこれらの単語の値を数値に変換し、計算します..私もそれを行うことができました。 。現在のバグは次のとおりです。ファイルでstopが発生した場合は、読み取りを停止して終了する必要があります。したがって、Wordsが[stop]Endの場合は終了します。私は次のことを試しました...

execute :-
 extract(Words),
 Words = [stop],nl,print('Terminating ...'),!.
execute :-
 extract(Words),
 calculate( Words,0).

正常に終了します..しかし、複数回抽出するため、行をスキップします..実行しようとしました..

execute :-
 extract(Words),
 Words \= [stop],execute(Words).
execute(Words) :-
 calculate( Words,0).

言葉が止まらない場合は..それから行って計算してください..しかしそれは機能していません!!

私は助けに感謝します..ありがとう

4

1 に答える 1

3

副作用(ここでは、ファイルからの読み取りと次の用語への移動)は、バックトラックで元に戻されません。一度読んでから、if / then / elseまたは補助述語を使用して、読んだ用語に基づいて選択することができます。次に例を示します。

execute :-
        extract(Words),
        (   Words == [stop] -> nl, write('Terminating ...')
        ;   calculate(Words, 0)
        ).

SWI-Prologでは、期待どおりにバックトラックを処理するlibrary(pio)を介して記述された純粋なファイル読み取りに使用することを検討してください。

于 2010-12-31T09:44:35.357 に答える