Поведение `nth0/3`, когда N не привязан

Если я наберу в SWI Prolog запрос "nth0", результат будет таким:

?- nth0(N,X,a).
N = 0,
X = [a|_G282] ;
N = 1,
X = [_G281, a|_G285] ;
N = 2,
X = [_G281, _G284, a|_G288] ;
... etc

однако в руководстве SWI сказано:

Errors
  type_error(integer, Index) if Index is not an integer or unbound.

Итак, если я правильно понимаю этот текст (?), кажется, что вместо предыдущих результатов должна быть вызвана ошибка.

Кроме того, мне интересно, какое из поведений является правильным с учетом стандарта ISO.

(Я знаю, что переполнение стека не разрешает вопросы для ссылок, поэтому я не буду просить ссылку на стандарт, но я надеюсь, что не нарушу правила, если я спрошу: общедоступен ли стандарт ISO? если нет, есть какие-либо эквивалентный RFC?).


person pasaba por aqui    schedule 29.05.2015    source источник
comment
См. тег iso-prolog для стандарта.   -  person false    schedule 29.05.2015
comment
(в настоящее время, во времена открытого исходного кода, мы не можем ожидать, что пролог станет популярным, если даже стандарт не является общедоступным. Моя поддержка любому, кто начинает открытый, например, как RFC).   -  person pasaba por aqui    schedule 29.05.2015
comment
Я настоятельно рекомендую вам посетить вводный курс по стандартам, проводимый вашим национальным институтом стандартизации, чтобы понять разницу между RFC и стандартом.   -  person false    schedule 29.05.2015


Ответы (2)


Предикат nth0/3 не является частью ISO Prolog, поэтому явной ссылки на него нет. Однако то, как и когда сообщается об ошибках, определено в стандарте. В частности, об ошибках типа никогда не сообщается из-за того, что аргумент недостаточно инстанцирован. Конкретная формулировка в руководстве SWI немного неудачна. Вместо nth0(N, Xs, E) следует читать:

N не является ни переменной, ни целым числом
type_error(integer, N).

Если бы сейчас было ограничение на создание экземпляра N (это не в данном случае, но давайте предположим это), то было бы условие ошибки:

N – это переменная
instantiation_error.

Предикат nth0/3 раньше был частью библиотеки DECsystem 10 listut (также пишется как ListUt) с 1983 года. Первоначально это определение предназначалось для использования только с целым числом N. Однако ошибок в том виде, в каком они есть сейчас, еще не существовало, и система просто (и некорректно) дала сбой с неэкземплярной переменной.

Позже он был принят (и исправлен) Quintus Prolog примерно в 1984 году.

Теперь у нас есть сложная классификация ошибок, которая способен улавливать тонкие семантические различия между различными ошибочными ситуациями.

Подробнее об определении предикатов в стандарте.

person false    schedule 29.05.2015

Если я правильно прочитал это, там говорится, что для

nth0(?Index, ?List, ?Elem)

"... если Index не является целым числом или несвязанным."

В примере Index не привязан:

?- nth0(N, L, E).
N = 0,
L = [E|_G1103] ;
N = 1,
L = [_G1102, E|_G1106] ;
N = 2,
L = [_G1102, _G1105, E|_G1109] .

Так может вы невнимательно читаете инструкцию?

Просто чтобы убедиться: руководство следует понимать как «... если Index не ( или ( целое число, несвязанное ) )». Что он делает, когда Index не привязан, так это то, что он начинает перечислять допустимые списки, где Index может быть 0 или больше.

person Community    schedule 29.05.2015
comment
@pasabaporaqui Есть один правильный способ интерпретировать это, и я указал, какой. См. ответ false, чтобы лучше сформулировать это требование. - person ; 29.05.2015