Наименьшая `max_arity` составных терминов в программах ISO Prolog - PullRequest
2 голосов
/ 16 февраля 2020

Системы Prolog, нацеленные на соответствие, делают не должны поддерживать составные термины с произвольно большими массивами. Флаг Пролога max_arity отражает это.

Согласно ISO / IEC 13211-1: 1995:

7.11.2.3 Флаг: max_arity

Возможные значения: только значение по умолчанию

Значение по умолчанию: реализация определена

Изменяемый: Нет

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

Таким образом, системы Prolog могут или не могут навязывать верхний предел для max_arity ... а как насчет нижнего предела 1031 *? Допустим, скажем, 5 хорошо?

НЕТ! ISO / IEC 13211-1: 1995 / Cor.2: 2012 , Технический Исправление 2, определяет call/2..8 как:

8.15.4 вызов / 2..8
...
ПРИМЕЧАНИЕ. - A стандарт- соответствующий процессор может реализовать вызов / N одним из следующих способов , поскольку условие ошибки d зависит от реализации (3.91). 1) Реализуйте только семь встроенных предикатов от вызова / 2 до вызова / 8. 2) Реализуйте call / 2..N до любого N, который находится в пределах 8..max_arity (7.11.2.3). Произведите ошибки существования для больших арностей ниже max_arity. 3) Реализуйте call / 9 и выше только для определенных режимов выполнения.

Все эти способы * только 1052 * подразумевают Max_arity >= 8 - но не более того.

Так мой вопрос имеет (как минимум) две стороны :

  1. Пролог пользователя :
    "Какова максимальная арность I может использовать , если я хочу избежать блокировки поставщика? "

  2. Prolog Implementor :
    " Что такое наименьшее Max_arity I должен поддерживать , если я нацеливаю 1 на соответствие ISO-Prolog? "

Сейчас я вполне уверен Ответ таков:

Да, Max_arity = 8 все в порядке.

Но так ли это на самом деле? Есть ли какие-то улики, которые мне не хватает? Пожалуйста помоги! Спасибо заранее!


Сноски:
1) Да.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2020

Объявление 2: Стандартное соответствие является предварительным условием для работающей системы. Это ни в коем случае не является гарантией того, что система пригодна для любых целей, включая ту, которая вас (разумно) интересует. Учитывая, что я бы сказал, 1 - это минимум, поскольку ноль не может быть сложностью сложного термина. Конечно, любая попытка создать список приведет к ошибке представления. Может быть и хуже, см. Назначение this .

Использование встроенных модулей с большей арностью (5 или 8) не исключено в таком процессоре. В конце концов, соответствующий процессор должен просто подготовить текст Пролога для исполнения (5.1.a) и правильно выполнить цели Пролога (5.1.b). Нигде не говорится, что такие цели представлены как составные термины.

Но, конечно, это то, чего мы ожидаем, поскольку мы ожидаем, что сможем программировать наш собственный верхний уровень l oop, который сам по себе выходит за рамки ISO / IEC 13211-1.

Объявление 1: Что касается переносимости в будущем, 255 представляется минимальным. Но если у него 127. Минерва 125. Конечно, unbounded будет лучшим выбором, до 7 для быстрого и компактного представления.

0 голосов
/ 16 февраля 2020

Предикат стандарта ISO Prolog с большим числом аргументов равен sub_atom/5. Мы можем использовать этот предикат, чтобы оправдать по крайней мере call/6 и, следовательно, максимальную арность по крайней мере 6:

| ?- call(sub_atom, A, B, C, D, E).

Конечно, с call/6 ничто не мешает программисту вызвать, например,

| ?- call(foo(A,B,C), D, E, F, G, H)
...