Наименьшая `max_arity` составных терминов в программах ISO Prolog

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

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

7.11.2.3 Флаг: max_arity

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

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

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

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

Итак, системы Prolog могут или не могут устанавливать верхний предел для max_arity ... но как насчет нижнего ограничения? Скажем, 5 в порядке?

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

8.15.4 call / 2..8
...
ПРИМЕЧАНИЕ. Соответствующий стандарту процессор может реализовать call / N одним из следующих способов поскольку условие ошибки d зависит от реализации (3.91).

  1. Реализуйте только семь встроенных предикатов от call / 2 до call / 8.
  2. Реализуйте call / 2..N до любого N, которое находится в пределах 8..max_arity (7.11.2.3). Выдают ошибки существования для больших арностей ниже max_arity.
  3. Реализуйте call / 9 и выше только для определенных режимов выполнения.

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

Итак, у моего вопроса есть (как минимум) две стороны:

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

  2. Разработчик Prolog:
    Какую наименьшую Max_arity я должен поддерживать, если я стремлюсь 1 к соответствию ISO-Prolog?

Прямо сейчас я вполне уверен, что ответ таков:

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

Но так ли это на самом деле? Есть какие-то подсказки, которые мне не хватает?


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


person repeat    schedule 16.02.2020    source источник


Ответы (3)


Как-то есть пробел. max_arity охватывает только составной размер. Но нет флага для размера предиката. Как показывает SWI-Prolog, эти две вещи могут отличаться. Но SWI-Prolog неправильно называет предел max_arity, хотя это не его флаг max_arity:

/* SWI-Prolog 8.3.19 */

?- functor(_,f,10000).
true.

?- functor(F,f,10000), assertz(F).
ERROR: Cannot represent due to `max_arity' (limit is 1024, request = 10000)

?- current_prolog_flag(max_arity, X).
X = unbounded.

Предел размера предиката может быть более релевантным для call / n, чем составной размер. Определение основного стандарта ISO немного неудовлетворительно.

Но это не было тщательно проверено, но исправление на стороне SWI-Prologs в стадии разработки:

?- functor(F,f,10000), assertz(test:-F).
F = f(_ ...)

?- functor(F,f,10000), call(F,a).
%%% crash

Изменить 25.02.2021:
Ошибка в сообщении об ошибке объясняется только при просмотре C-кода SWI-Prolog, который имеет C Constant MAXARITY со значением размера предиката. . Эта константа и сообщение об ошибке, возможно, предшествовали основному стандарту ISO, который ввел еще одну константу.

person Mostowski Collapse    schedule 24.02.2021

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

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

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

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

Есть какие-то подсказки, которые мне не хватает?

В этом контексте часто наблюдают за отношением сложных терминов к предикатам. Система может поддерживать предикаты только с меньшей арностью, чем max_arity - подходящей ошибкой для выдачи здесь будет resource_error. Сравните эту ситуацию с системой с current_prolog_flag(max_arity, unbounded) и целью functor(F,f,N) с N превышением адресного пространства процессора (в текущих реализациях). Хотя такая цель никогда не будет успешной в текущих реализациях, она по-прежнему выдает resource_error, а не representation_error.

person false    schedule 16.02.2020
comment
Хорошо! Но я все еще жду ответ, с которым вы связались???? - person repeat; 18.02.2020
comment
Я думаю, что получил рекламную часть вашего ответа, но должен признать, что я не совсем доволен ею. Может быть, нет однозначного идеального ответа. Если разработчик выбирает неограниченный, пользователям этой конкретной системы в некоторой степени рекомендуется писать код, который не работает в системах с некоторым конечным значением max_arity. Рассмотрим SICStus и SWI. SICStus может или не может переключаться с 255 на неограниченное, но в настоящее время программы SWI, которые эффективно используют значение больше 255, не могут работать напрямую с SICStus. Эта проблема усугубляется тем, что системы больше не находятся в активной разработке. - person repeat; 18.02.2020
comment
Мой программный менеджер свел процесс принятия решения к тому, что в случае неуверенности, когда это возможно, делать / имитировать / фальсифицировать все, что делают конкуренты. Умная. - person repeat; 18.02.2020
comment
@repeat: кто ваши конкуренты? Прошлое или будущее? - person false; 18.02.2020
comment
Хороший вопрос! Мой премьер-министр посоветовал мне заняться этой проблемой на перспективной основе. - person repeat; 19.02.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)
person Paulo Moura    schedule 16.02.2020
comment
call/8 самый большой см. OP - person false; 16.02.2020