저는 쉽게 벽이 있어야한다고 생각하는 벽으로 머리를 때 리고있는 것처럼 느낍니다. 아마도 내 접근 방식이 잘못되었습니다. 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
선은 필요하지 않습니다 문자 목록으로 읽어야하지만 내 목표는 특정 조건 (예 : 반복 문자 없음)과 일치하는 단어 목록을 검색하는 것이므로 가장 합리적인 방법이라고 생각했습니다.
재미있는, 감사 : 반환 ... 마지막에
테스트를 end_of_file. 'open ('word_list.txt', read, ID) .'과'get_code (ID, Char) .'가 뒤따 랐는데 오류가 발생했습니다 (첫 번째 인수가 별칭이나 스트림이 될 것으로 생각합니다. 변수가 아니라 스트림을 별칭에 바인딩하는 방법을 잘 모르겠습니다.) 위의 작업을 복사하는 것은 똑같은 일을하는 것입니다 :'uncaught exception : error (instantiation_error, get_code/2)' –
내 예제에서는 open() 뒤에 쉼표가 있지만 ** 점은 없습니다. 난 당신이 스트림 처리기로 uninstantiated 변수를 사용하려고하는 것 같아요. – CapelliC