Что такое допустимые / правильные системные ошибки в ISO-Prolog? - PullRequest
1 голос
/ 04 мая 2020

TL; DR : этот вопрос касается деталей реализации Prolog. Действуйте на свой страх и риск. Вы были предупреждены:)


Согласно ISO / IEC 13211-1995 «7.12 Ошибки»:

7.12.2 Ошибка классификация

[...]

j) Системная ошибка может возникнуть на любом этапе выполнения. Условия, при которых должна возникать системная ошибка, и действия, предпринимаемые процессором после системной ошибки, зависят от реализации. Он имеет вид system_error.

[...]

ПРИМЕЧАНИЯ

[...]

4 Системная ошибка может произойти для пример (а) при взаимодействии с операционной системой (например, ошибка диска sh или прерывание), или (б) когда цель throw(T) была выполнена и нет активной цели catch/3.

Хорошо, но несколько расплывчато ... Итак, вот мой актуальный вопрос:

Допустимы ли следующие варианты использования system_error?

  1. Система пролога «L» не предлагает изменяемых отображений преобразования символов. Вместо этого он ведет себя следующим образом:

    current_char_conversion(X, Y) :-
       maplist(can_be(character), [X,Y]),
       false.                       % mapping unch.
    
    char_conversion(X, Y) :-
       maplist(must_be(character), [X,Y]),
       (  X == Y
       -> true                      % removal is OK
       ;  throw(error(system_error,
                      not_supported(char_conversion/2)))
       ).
    
  2. Система пролога «K» поддерживает списки управления доступом для запрета использования некоторых предикатов во время определенных частей выполнения. Каждый раз, когда такой предикат вызывается в ограниченной части кода, происходит следующее:

    throw(error(system_error, disallowed(P/N)))
    

Могут ли системы Prolog «L» и «K» по-прежнему называться «стандартами ISO» совместимый "?

1 Ответ

1 голос
/ 05 мая 2020

Не ответ на ваш вопрос о соответствии, но ...

throw(error(system_error, disallowed(P/N)))

Ошибка разрешения имела бы здесь больше смысла. Но возможные значения для операции и типа разрешения из стандарта не идеальны. Возможно, их расширение и использование чего-то вроде

permission_error(call, predicate, P/N)

A resource_error/1 также не будет здесь надуманным.

...