ストリーム

「ストリーム」の編集履歴(バックアップ)一覧に戻る

ストリーム - (2014/05/07 (水) 13:08:57) の編集履歴(バックアップ)


ストリーム系述語 see/2,get0/2,tell/2,put/2
  ファイルのオープン・クローズ、また、入出力に関する述語を説明します。

  • see/2
  seeは第一引数を入力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
  このストリーム値を後述するget0などの第一引数に渡すと、指定ファイルからの入力が可能となります。
  seeのあとは、入力終了後に必ずseenという述語にストリーム値を渡してクローズする必要があります。

  • get0/2
  get0はseeの第2引数に返されたストリーム値を渡すことで任意のストリームから読み込むことの出来る述語です。
  入力値は1文字ずつ取り出され第二引数に文字コードで返されます。

  • 例 see,seen,get0
test:-
kanji_mode(_,on),
see('a.txt',S),
	repeat,gets(S,X,N),f(X),N=:=1,
seen(S).

f(X):-name(Y,X),write(Y),nl.

gets(S,L,N):-get0(S,X),gets(S,X,L,N).
gets(S,4,[],1):-!.  %for Linux
gets(S,26,[],1):-!. %for Linux
gets(S,10,[],0):-!. %LF
gets(S,13,[],0):-!. %CR
gets(S,31,[],0):-!. %for az-prolog
gets(S,X,[X|L],N):-gets(S,L,N).

a.txt(事前に作成しておきます)
0123456789
あいうえお
Hello
今日

  • 解説
  testという述語は最初にsee述語でa.txtというテキストファイルを読み込んでいます。
  次に使用されているrepeatという述語は、その述語以降でfailが起きた場合に、処理を繰り返す述語です。
  ここでは、ファイルの終了フラグN=1が立てられるまで、failさせて繰り返す使い方をしています。
  get0は読み込まれたファイルの値を1文字づつ取り出しています。

  fという述語は自作の述語です。
  ここでは単にgets述語で得られたjisコードを格納したリストをアトムに型変換して
  write述語でインタプリタに出力しているだけの述語です。
  最後にseenによって入力ストリームをクローズしています。
  なお、この例では文字コードをWindows環境を想定して作られているため、環境が異なる場合には、
  EOFや改行コードが異なる場合があります。

  • 実行してみましょう
?-test.
49
50
51
yes

  aaa.txtの内容がget0で取り出された文字コードの形で出力されていることがわかります。




  • tell/2
  tellは第一引数を出力ファイルとしてオープンし、そのストリーム値を第二引数の変数にユニファイする述語です。
  このストリーム値を後述するputなどの第一引数に渡すと、指定ファイルへの出力が可能となります。
  tellのあとは、必ずtoldという述語にストリーム値を渡してクローズする必要があります。

  • put/2
  putはtellの第2引数に返されたストリーム値を渡すことで任意のストリームに出力することの出来る述語です。
  入力値はアスキーコードとして認識され、出力時には対応する文字が出力されます。

  • 例 tell,told,put
test:-
  see('aaa.txt',S),
  tell('bbb.txt',S2),
    repeat,get0(S,X),put(S2,X),X=:=26,
  told(S2),
  seen(S).

aaa.txt(事前に作成しておきます)
1
2
3

  • 解説
  上記の例は最初にsee述語でaaa.txtというテキストファイルを読み込んでいます。
  次にtellで出力先のファイルbbb.txtを指定しています。
  そして、get0によって入力ファイルの値を取得し、putで出力ファイルへ書き込みを行っています。
  以上の処理を入力値がファイルの最後(EOF)となるまで、repeatで繰り返しています。
  最後にそれぞれ、toldとseenで出力ファイルと入力ファイルをクローズさせています。

  • 実行してみると、aaa.txtと同じ内容のbbb.txtというファイルが作成されます。




デバッグ用述語 trace/0 , spy/fy

  実際のコーディングを行う際に便利なデバッグ関連の述語を説明します。


  • trace/0
  traceは実行することで、トレースモードを開始することの出来る述語です。
  トレースモード中は、コールする全述語の「成功」「失敗」「エラー」等が画面に表示されます。

  • 例 tarace
 a.
 b.
 c.
 test:-a,b,c. 

普通に実行
| ?-test.
yes

トレース開始
| ?-trace.
yes
debug mode on
||?-test.
 [1] 0 Try   : test ? 
  Match   : test :-
		a,
		b,
		c.
 [2] 1 Try   : a ? 
  Match   : a.
 [2] 1 Succ  : a
 [2] 1 Try   : b ? 
  Match   : b.
 [2] 1 Succ  : b
 << LAST CALL >>
 [1] 0 Try   : c ? 
  Match   : c.
 [1] 0 Succ  : c
yes
LOOP = 5

トレース終了
||?-nodebug.
 [1] 0 Try   : nodebug ? 
 << BUILTIN CALL >>
yes
debug mode off
| 

  • 解説
trace実行前のtest述語の実行では、述語の実行結果のみが返ってきているのに対し、
trace実行後はtest述語内での各述語の実行結果についても表示されていることがわかります。


  • spy/1
  spyはトレース時に、引数で指定した述語に対して、他の言語で言うところのブレークポイントとして指定する述語です。
  spyの引数で指定された述語をスパイポイントと呼びます。
  spyを実行するとトレースモードに入り、その後、処理中にスパイポイントの含まれた述語を実行すると
  スパイポイントの箇所からのデバックが表示されます。


  • 例 spy
 a.
 b.
 c.
 test:-a,b,c. 

bという述語をスパイポイントに指定
| ?-spy(b).
yes
debug mode on
||?-test.
 [2] 1 Try   : b ? 
  Match   : b.
 [2] 1 Succ  : b
 << LAST CALL >>
 [1] 0 Try   : c ? 
  Match   : c.
 [1] 0 Succ  : c
yes
LOOP = 5

  • 解説
  前述したtraceの例と違って、spy(b)でスパイポイントに指定された、bという述語以降からデバッグが
  表示されることがわかります。


なお、デバッガについての説明は、以下のサイトに詳細が書かれていますので、こちらもご参照ください
Az-Prolog User's Manual Chapter7 デバッガ
http://www.az-prolog.com




まとめ

今回は以下の事を学習しました。
  • 入出力ストリームのオープン・クローズ
  • デバッグ関連述語