Подтвердить что ты не робот

Каковы типы данных в Prolog?

Согласно Википедии, единственным типом данных в Prolog является термин. В этом в тексте также упоминается, что "пролог одиночных данных - это термин", но затем продолжает объяснять "классификацию типов данных в Prolog" (но Я думал, что существует только один тип...) Теперь эти слайды указывают разные типы данных: "числа, символы и строки".

Итак, каковы фактические типы данных в Prolog?

4b9b3361

Ответ 1

Я укушу: у Prolog есть один тип данных term. Не очень полезный ответ, а??

Термины подразделяются на

  • Переменные. Заполнитель, не связанный с каким-либо конкретным термином. Переменные идентифицируются символами, соответствующими регулярному выражению [A-Z_][A-Za-z_0-9]*. Переменная _ является специальной: это анонимная переменная. Каждое вхождение _ обозначает различную переменную. Например, учитывая тот факт,

    foo(1,2,3).
    

    Тест, подобный foo(_,_,_)., будет успешным, тогда как тест типа foo(A,A,A). завершится с ошибкой.

    Как только переменная объединена с (привязана) к значению, она перестает быть переменной: если не отменено путем обратного отслеживания, это всегда и всегда то, с чем она объединяется.

  • Числа - это float или integer. Используются обычные виды правил (например, -321 - целое число, -321.0 или что-то вроде -3.21e+02 - это float.

  • Атомы - это имена, обычно обозначаемые словом, начинающимся с буквы нижнего регистра (например, atom), соответствующей регулярному повторению [a-z][A-Za-z0-9_]*. Альтернативно, атомы могут быть разделены апострофами (например, 'atom'), что позволяет удобно использовать символы, которые в ином случае не допускаются. Синтаксис для атома несколько более сложный, чем это: в сущности, все, что не попадает в другую категорию, будет образовывать атом (например, специальный атом [], обозначающий пустой список, и запятая (,), обозначающая соединение, все атомов.

  • Все остальное по существу представляет собой структуру , т.е. кортежи терминов, помеченные функтором (имя, соответствующее правилам для атома) с арностью (количеством аргументов). Можно рассматривать атомы как структуру arity 0.

Синтаксический сахар выливается поверх прологовых других "типов данных":

  • Списки обозначаются структурой ./2, причем левым аргументом является глава списка и правый хвост. Пустой список обозначается атомом []. Например,

    • список [a] внутренне представлен как .(a,[]),
    • список [a,b] как .(a,.(b,[])) и
    • список [a,b|[c]] как .(a,.(b,.(c,[]))).

    Следует отметить, что можно написать список, используя либо обозначение: они будут унифицированы соответствующим образом. Однако вы можете увидеть привлекательность использования нотации в скобках.

  • Подобный синтаксический сахар применяется к строкам. Строка может быть записана как строка текста, ограниченная двойными кавычками: "The cat and the hat". Однако внутри строк строки представлены в виде списков целых чисел, представляющих кодовые точки для каждого из символов внутренней кодировки реализации. Например, строка "cat" внутренне представляется (в ASCII/UTF-8) как список [99,97,116]. "cat" легче читать, а?

Ответ 2

единственным типом данных в Prolog является термин

Это утверждение является одновременно правильным и несколько бесполезным. Говорят, что типы не играют большой роли в Prolog: все это термин, переменные нетипизированы, они будут объединяться с другими терминами по мере необходимости.

Числа, атомы и составные термины, с другой стороны, не являются типами данных - это разные типы терминов, которые несколько отличаются. Сложные члены далее подразделяются на списки, строки и "другие" типы функторных терминов.

Ответ 3

В моем не столь скромном мнении, что " Объекты данных языка называются членами. Термин - это либо константа, либо переменная, либо составной термин" (и предложение является составным термином) звучит хорошо, но синтаксис EBNF фактически имеет около 6 целых страниц, поэтому существует (много) скрытая структура, не выраженная в этом утверждении. Таким образом, текст программы может быть разложен на эти несколько синтаксических классов, но их также интересуют Списки, Дикты, Строки и т.д., Которые должны собираться с этих низкоуровневых произведений особыми способами. Во всяком случае, следует рисунок.

(Обратите внимание, что я включил SWI Prolog 'dict'. Также есть вещи, называемые "иностранными терминами", которые используются при вызове внешнего кода, а "строка", наконец, получила отдельный тип данных в SWI Prolog. Думаю, изображение было создано с помощью yEd, необработанный графический файл можно найти здесь.)

So, I heard you like terms...

И для тех, кто любит историю, вот описание "термина" из первого руководства Prolog, написанного Филиппом Русселем в сентябре 1975 года, которое можно найти на Prolog Héritage.

First writeup of Prolog term

Ответ 4

В стандарте ISO и его исправлении 2 есть пара тестовых предикатов, которые проверяют типы данных в Prolog. Ричард О'Киф использовал для размещения этих тестовых предикатов http://www.complang.tuwien.ac.at/ulrich/iso-prolog/okeefe.txt следующим образом:

                    true
                      |
            +---------+---------+
            |                   |
         nonvar                var
            |
  +---------+--------------------------+
  |                                    |
compound                           atomic=constant
                                       |
            +----------------+---------+---------+
            |                |                   |
          number          string             atom=symbol
            |
    +-------+-------+ 
    |               |
 integer            float

Я оставил рациональным и сложным, которые не являются частью ISO Prolog, но я сохранил строку, хотя она также не является частью ISO Prolog, но, например, подлинными строками, то есть не сдвоенным сокращенным списком для кодов символов, а реальный тип данных, в настоящее время находятся в версии SWI-Prolog 7. Обычно ISO Prolog позволяет добавлять новые типы данных в реализацию Prolog.

В дереве есть несколько приятных свойств:

1) Братья и сестры исключительны:
Если s1,..., sn - братья и сестры, тогда максимум один из тестовые предикаты si будут удерживаться для данного аргумента. Так, например, мы знаем, что либо float (X), либо целое число (X) или ни одно из двух значений, но не оба вместе могут выполняться для конкретного X.

2) Дети содержатся в родительском объекте:
Если c - дочерний элемент, p - родительский, то c означает p. Так, например, мы знаем, что если число (X) выполнено, то для конкретного X выполняется также атомное (X).

В базовом стандарте ISO есть больше типов данных, которые не могут быть легко вписаны в дерево. Например, атом длины 1 называется символом. Целое число от 0..max_code называется символьным кодом. Целое число от 0..255 называется байтом. Иногда код символа или байта соответственно. символ может также включать -1 или. END_OF_FILE. Эти типы данных не имеют собственного тестового предиката, тесты должны быть получены из других предикатов.

Строго говоря, базовый стандарт ISO также определяет ячейки списка просто как соединения arity 2 с функтором '.', а пустой список - как атом '[]'. Некоторые системы Prolog, такие как, например, версия SWI-Prolog 7 нарушают это правило и используют другой функтор для ячеек списка. Более новый ISO-предикат ISO/1 объединяет атомы и соединения.

Тогда существуют более целостные тестовые предикаты, которые не смотрятся только на тип манифеста корневого элемента данного термина. Например, предикат ground/1 должен смотреть на весь термин, так и тестовый предикат acyclic_term/1, оба являются частью стандарта ISO.

Ответ 5

См. http://ktiml.mff.cuni.cz/~bartak/prolog/data_struct.html

Термин - это контейнер, который может содержать несколько разных видов данных (думаю, наследование в объектно-ориентированных языках)