Ответ в теме: Переписывание чисел из одного файла в другой на Prolog

      Комментарии к записи Ответ в теме: Переписывание чисел из одного файла в другой на Prolog отключены
#3063

Один из вариантов решения — считывать из файла символы, проверять являются ли они цифрами и если являются — переписывать во второй файл. Для этого нам потребуется функция проверки символа:

predicates
is_digit(char)
clauses
is_digit(Char):-
frontchar(Str, Char, ""),
str_int(Str, _).

Функция должна принимать символ (тип char), однако для проверки мы используем встроенную в visual prolog 5.2 функцию str_int, выполняющую преобразования между числом и строкой. Мы преобразуем символ в строку при помощи встроенной функции frontchar.

В более новых версиях Visual Prolog для такой проверки можно использовать math::tryToInteger(String) -> integer determ или toTerm : (string)->Term, а в SWI Prologchar_type(?Char, ?Type) с подстановкой в качестве типа константы digit.

После этого открываем один файл для чтения, другой для записи и устанавливаем их вместо стандартных потоков ввода/вывода. Подробнее: Работа с файлами на Visual/Turbo Prolog:

global domains
file = text_input_file; text_output_file
goal
InputFileName = "/home/rrrfer/input.txt", 
OutputFileName = "/home/rrrfer/output.txt",
openread(text_input_file, InputFileName), 
write("input file opened"), nl,
openwrite(text_output_file, OutputFileName), !,
write("output file opened"), nl,
readdevice(text_input_file),
writedevice(text_output_file),
print_numbers(text_input_file),
closefile(text_input_file),
closefile(text_output_file),
write("completed"), nl.

Функция print_numbers читает символы с потока ввода до тех пор, пока файл не кончится. Для каждого символа вызывается предикат is_digit, на основании результатов работы которого принимается решение — пропустить текущий символ или записать его в выходной файл:

print_numbers(File):-
eof(File), !.
print_numbers(File):-
readchar(Char),
is_digit(Char), !,
write(Char),
print_numbers(File).
print_numbers(File):-
print_numbers(File).