首页 > 解决方案 > ISO-Prolog 中的合法/正确系统错误是什么?

问题描述

TL;DR:这个问题是关于 Prolog 实现细节的。继续需要您自担风险。你已经被警告了:)


根据 ISO/IEC 13211-1995“7.12 错误”:

7.12.2 错误分类

[...]

j) 在执行的任何阶段都可能出现系统错误。应有系统错误的条件以及处理器在系统错误后采取的行动取决于实现。它有形式system_error

[...]

笔记

[...]

4 系统错误可能发生在例如 (a) 与操作系统的交互中(例如,磁盘崩溃或中断),或 (b) 当目标throw(T)已执行且没有活动目标时catch/3

好的,但有点模糊......所以这是我的实际问题:

以下用途system_error合法吗?

  1. Prolog 系统“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. Prolog 系统“K”支持访问控制列表,以在执行的某些部分禁止使用某些谓词。每当在代码的受限部分调用这样的谓词时,就会发生这种情况:

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

Prolog 系统“L”和“K”还能被称为“符合 ISO 标准”吗?

标签: prologapi-designiso-prolog

解决方案


不是您关于合规性问题的答案,但...

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

权限错误在这里会更有意义。但是标准中操作和权限类型的可能值并不理想。也许扩展它们并使用类似的东西

permission_error(call, predicate, P/N)

Aresource_error/1在这里也不会牵强。


推荐阅读