Ответ в теме: Переписывание чисел из одного файла в другой на 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).