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

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

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Переписывание чисел из одного файла в другой на Prolog

Помечено: , ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 5 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #3062

    questioner
    Участник

    Помогите создать предикат на Visual 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).

Для ответа в этой теме необходимо авторизоваться.