2009年7月9日木曜日

12 Working With Files


* 12 Working With Files
** 1 Splitting Programs over Files
- consult
- [FileName]. (at top-level)
- 実体はconsultという述語らしい。
- ファイルの中で使うときは頭に:-をつけるようだ。
- ensure_loaded
- ensure_loaded([FileName]).は、読み込み済みで無
変更なものは再読み込みしないようだ。
- module
- そのファイルをmoduleにする。
- :- module(ModuleName,
List_of_Predicates_to_be_Exported).
- use_module
- moduleを使う。
- :- use_module(ModuleName).
- importする述語の指定(制限)もできる。
- :- use_module(ModuleName,
List_of_Predicates_to_be_imported).
- library
- 処理系にてライブラリとして定義されているもの
を指定する。use_moduleとあわせて使う。
- 例:
:- use_module(library(lists)).

** 2 Writing to Files
- streamがある。使い方はこんな感じ。

open('hoge.txt',wrie,Stream),
write(Stream,'This is hoge.',nl(Stream),
close(Stream).

** 3 Reading from Files
- read/2
- streamからPrologのtermsを読み込む。
- streamが読むものがないとエラーになる。
- at_end_of_stream/1
- streamの終端の検知。
- get_code/2
- streamからcharacterをひとつ読む。

** 4 Exercise
- Exercise 12.1.

main :-
open('hogwarts.houses',write,Stream),
tab(Stream,10),write(Stream,'glyffindor'),nl(Stream),
tab(Stream,3),write(Stream,'hufflepuff'),tab(Stream,4),write(Stream,'ravenclaw'),nl(Stream),
tab(Stream,10),write(Stream,'slytherin'),nl(Stream),
close(Stream).

- Exercise 12.2.

:- dynamic word/2.

main :-
open('swipl-man.txt',read,S),
doWords(S),
close(S).

readWord(InStream,W) :-
get_code(InStream,Char),
checkCharAndReadRest(Char,Chars,InStream),
atom_codes(W,Chars).

checkCharAndReadRest(10,[],_) :- !.
checkCharAndReadRest(32,[],_) :- !.
checkCharAndReadRest(-1,[],_) :- !.
checkCharAndReadRest(end_of_file,[],_) :- !.
checkCharAndReadRest(Char,[Char|Chars],InStream) :-
get_code(InStream,NextChar),
checkCharAndReadRest(NextChar,Chars,InStream).

doWords(InStream) :-
\+ at_end_of_stream(InStream),
readWord(InStream,W),
writeWord(W),
doWords(InStream).

writeWord(Word) :-
Word \== '', memoize(Word).
writeWord('').

memoize(W) :-
word(W,N),M is N+1,asserta(word(W,M)),retract(word(W,N)),!.
memoize(W) :- asserta(word(W,1)).

** 5 Practical Session
- 今まで作ってきたものをモジュール化して統合。
- モジュール名と、ファイル名の拡張子より前は、同
じでないといけないみたい。
- Step 2までにしておき、後は入出力の練習なので、
割愛する。


読了!!!!
頭がくたくただ!

0 件のコメント: