2011-11-22 64 views
2

可能重複:
Read a file line by line in Prolog讀取文件在序言

我發現下面的序言碼一次讀取一個字符,並打印出來。

process(File) :- 
     open('C:/Users/BHARAT/Desktop/a.txt', read, In), 
     get_char(In, Char1), 
     process_stream(Char1, In), 
     close(In). 

process_stream(end_of_file, _) :- !. 
process_stream(Char, In) :- 
     print(Char), 
     get_char(In, Char2), 
     process_stream(Char2, In). 

但如果文件有多條線路,有沒有辦法在一個時間閱讀1整條生產線,這樣就容易進行符號化。

回答

4

你說你想標記輸入 - 最好的方法是定義從句語法(DCG)。隨着SWI library(pio)你可以直接使用語法來讀取文件中的像這樣:

?- use_module(library(pio)). 
?- phrase_from_file(seq(Xs),f). 

seq([]) --> []. 
seq([E|Es]) --> [E], seq(Es). 

一些更復雜的分詞現在更換seq//1

2

SWI-Prolog有一些支持謂詞,例如:

..., read_line_to_codes(Stream, Codes), phrase(parse, Codes, []), ... 

但我會建議你採用phrase_from_file/2(在另一個答案已經建議)。有一個支持庫,以幫助解析輸入,與一些準備使用的解析器:

:- use_module(library(http/dcg_basics)). 

編輯支持庫已改名,有回兼容性把戲,它允許舊的命名,但現在它的更好使用庫(dcg/basics)。