Использование phrase_from_file для прочтения строк файла
-
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.