Ввод списка на prolog

      Комментарии к записи Ввод списка на prolog отключены

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

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

    questioner
    Участник

    Здравствуйте, мне нужен предикат на языке Prolog, позволяющий вводить список чисел. Например, после ввода очередного элемента можно спрашивать следует ли вводить еще элементы или ввод нужно прекратить.

  • #2434

    В SWI-Prolog и ряде других диалектов список является термом, поэтому для его ввода можно использовать стандартный предикат read. Например, следующим образом:
    read(List), is_list(List), write(List); write('is not a list').
    Напомню, что ввод в этом случае должен завершаться точкой, т.к. считывается терм. Результаты работы такого кода показаны на снимке экрана. Встроенная функция is_list проверяет является ли терм списком. Этот код будет отлично работать для любого терма, однако, если ввести некорректные данные (не терм) — то программа может выдать ошибку при выполнении функции read.

    Вложения:
  • #2436

    В Turbo Prolog и Visual Prolog 5.2 ввести список целиком нельзя — придется считывать его элементы по одному и каждый раз спрашивать следует ли продолжать ввод.

    domains
      list_d = integer*
    predicates
      readlist(list_d)
    clauses	
      readlist([Head|Tail]):-
        write("enter element value or empty string to finish: "), readint(Head), !,
        readlist(Tail).
      readlist([]).
    goal
      readlist(List).

    В данном случае первое правило функции readlist выводит пользователю информационное сообщение и пытается считать с клавиатуры целое число функцией readint. При вводе целого числа выполняется рекурсивный вызов для ввода хвоста списка. Если же будет введено что угодно кроме целого числа (в том числе пустая строка), выполнение будет передано второму правилу, возвращающему пустой список в любом случае.

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