Использование phrase_from_file для прочтения строк файла

StackOverflow https://stackoverflow.com/questions/6827701

  •  26-10-2019
  •  | 
  •  

Вопрос

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

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

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

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

РЕДАКТИРОВАТЬ :: Поскольку ни одно из решений ниже не соответствует моим потребностям (используя read/1 Предполагается, что вы читаете термины, а иногда пишете, что DCG может занять слишком много времени), я каннибализировал это Код, который я погуглил, основными изменениями являются добавление:

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

read_word(C,[],C) :- ( C=32 ;
                       C=(-1)
                     ) , !.
Это было полезно?

Решение

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

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

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

С уважением

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

Другие советы

Если вы используете 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top