Использование фразу_фром_файла для чтения строк файла - PullRequest
4 голосов
/ 26 июля 2011

Я пытался проанализировать файл, содержащий строки целых чисел, используя phrase_from_file с правилами грамматики

line --> I,line,{integer(I)}.
line --> ['\n'].

таким образом: phrase_from_file(line,'input.txt').

Это не удалось, и я очень быстро заблудился, пытаясь отследить его. Я даже пытался напечатать I, но это даже не дошло.

EDIT :: Поскольку ни одно из приведенных ниже решений не соответствует моим потребностям (использование read/1 предполагает, что вы читаете термины, а иногда пишете, что DCG может просто занять слишком много времени), я каннибализировал этот код, который я погуглил, основные изменения будучи добавлением:

read_rest(-1,[]):-!.

read_word(C,[],C) :- ( C=32 ;
                       C=(-1)
                     ) , !.

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Если вы используете phrase_from_file/2, существует очень простой способ проверить ваши программы перед чтением реальных файлов. Просто позвоните в тот же нетерминал с phrase/2. Таким образом, цель

phrase(line,"1\n2").

- это то же самое, что

phrase_from_file(line,fichier)

когда fichier - это файл, содержащий более 3 символов. Таким образом, вы можете тестировать и экспериментировать очень компактно с phrase/2.

Есть и другие проблемы, о которых @Jan Burse уже упоминал. SWI читает в кодах символов. Итак, вы должны написать

newline --> "\n".

для новой строки. И тогда вам все равно придется разбирать целые числа самостоятельно. Но все это проверяется гораздо проще с phrase/2. Приятно то, что вы можете переключиться на чтение файлов без изменения действительного кода DCG.

3 голосов
/ 26 июля 2011

Я думаю, здесь есть проблема зачатия.Хотя я не знаю подробностей о фразе_фрома_файла / 2, то есть, какую систему Prolog вы используете, тем не менее я предполагаю, что она будет генерировать коды символов.Таким образом, для целого числа 123 в файле вы получите коды символов 0'1, 0'2 и 0'3.Вероятно, это не то, что вам нужно.

Если вы хотите обработать символы, вам нужно будет использовать нетерминальную переменную вместо простой переменной I для их извлечения.И вместо целочисленного теста вам понадобится символьный тест, и вы можете сделать тест раньше:

line --> [I], {0'0=<I, I=<0'9}, line.

С наилучшими пожеланиями

PS: Вместо того чтобы использовать DCG, вы могли бытакже используйте термин операции чтения.Смотрите также: чтение чисел из файла в прологе и сортировка

...