2012-06-19 58 views

回答

4

只需用DCG說明你想用什麼來形容,並使用庫(PIO)從一個文件來分析:

:- use_module(library(pio)). 

all([])  --> []. 
all([L|Ls]) --> [L], all(Ls). 

例子:

?- once(phrase_from_file(all(Ls), 'all.pl')). 
Ls = [10, 58, 45, 32, 117, 115, 101, 95, 109|...]. 
+0

謝謝!這爲我做了詭計。我曾經看過使用DCG進行任意輸入的討論,但是無法建立如何將它用於讀取任意文件的連接。 – sdesciencelover

+0

@sdesciencelover:'library(pio)'的一大優點只會顯示出來,如果你已經對非終結者進行了處理。 'phrase_from_file/2'不是一次性讀取整個文件內容,而是做一些內部緩衝:這樣,abiritrary大小的文件就可以在恆定的空間中處理。 – false

+0

爲什麼一次/ 1?理想情況下,SWI應該檢測確定性。考慮使用call_semidet/1:http://stackoverflow.com/questions/12939794/stack-overflow-in-prolog-dcg-grammar-rule-how-to-handle-large-lists-efficiently/12942551#12942551 – false