2012-11-28 3 views
0

저는 쉽게 벽이 있어야한다고 생각하는 벽으로 머리를 때 리고있는 것처럼 느낍니다. 아마도 내 접근 방식이 잘못되었습니다. Prolog에서 I/O의 개념을 이해하는 것 같지 않습니다. (예 : 스트림 별칭과 open/3에 의해 바인드 된 변수의 차이점은 무엇입니까?) 그러나 나는 누설합니다 :GNU Prolog에있는 파일에서 한 줄을 읽으십시오.

GNU Prolog에서 파일을 한 줄씩 읽는 방법은 무엇입니까? (그래서 SWI가 가지고있는 편리한 함수에 접근하지 않아도된다.) get_char/1과 peek_char/1 (끝나는 개행을 검사하기 위해)과 관련이 있다고 가정하지만, 실행 가능한 솔루션을 구현하려는 나의 시도는 지금까지 실패했다. 인터프리터에

readl_as_list(ID, X):- 
    current_input(ID), 
    readl_as_list(X). 

readl_as_list([X]):- 
    (peek_char(NextChar), ==(NextChar, '\n'); 
     get_code(Char1), 
     append([X], [Char1], X), 
     readl_as_list(X)). 

printl_list([]):- 
    !, nl. 
printl_list([H|X]):- 
    put_code(H), printl_list(X). 

로딩이, 내가 (가독성을 위해 제거 된 빈 줄)을 얻을 :

여기

는 지금까지 내가받은 것 같다

| ?- open('word_list.txt', read, ID). 
ID = '$stream'(2) 
yes 
| ?- readl_as_list(ID, X). 
ID = '$stream'(0) 
X = [_] ? 
% (interpreter pauses until I press return) 
yes 
| ?- printl_list(X). 
X = [] 
yes 

선은 필요하지 않습니다 문자 목록으로 읽어야하지만 내 목표는 특정 조건 (예 : 반복 문자 없음)과 일치하는 단어 목록을 검색하는 것이므로 가장 합리적인 방법이라고 생각했습니다.

답변

2

필자는 코드 줄을 가져 오는 유틸리티를 작성했습니다.

?- open('data_grid.pl',read,S),repeat,read_line_codes(S,[],L),format('~s',[L]). 
/* File: data_grid.pl 
S = <stream>(0x335c9e0), 
L = [47, 42, 32, 32, 70, 105, 108, 101, 58|...] ; 
    Author: Carlo,,, 
S = <stream>(0x335c9e0), 
L = [32, 32, 32, 32, 65, 117, 116, 104, 111|...] ; 
    Created: Oct 20 2011 
S = <stream>(0x335c9e0), 
L = [32, 32, 32, 32, 67, 114, 101, 97, 116|...] ; 
... 
+0

재미있는, 감사 : 반환 ... 마지막에

read_line_codes(S, SoFar, L) :- get_code(S, C), ( C == -1 -> ( SoFar == [] -> L = end_of_file ; reverse(SoFar, L) ) ; ( C == 0'\n -> reverse(SoFar, L) ; read_line_codes(S, [C|SoFar], L) ) ). 

테스트를 end_of_file. 'open ('word_list.txt', read, ID) .'과'get_code (ID, Char) .'가 뒤따 랐는데 오류가 발생했습니다 (첫 번째 인수가 별칭이나 스트림이 될 것으로 생각합니다. 변수가 아니라 스트림을 별칭에 바인딩하는 방법을 잘 모르겠습니다.) 위의 작업을 복사하는 것은 똑같은 일을하는 것입니다 :'uncaught exception : error (instantiation_error, get_code/2)' –

+0

내 예제에서는 open() 뒤에 쉼표가 있지만 ** 점은 없습니다. 난 당신이 스트림 처리기로 uninstantiated 변수를 사용하려고하는 것 같아요. – CapelliC

관련 문제