首页 > 解决方案 > SWI prolog,char_type,ascii / alnum,为什么这么多字符?如何解决?

问题描述

我只是想检查一下,SWI-prolog 将什么字符视为“alnum”。我的问题条款是:

    findall(X,char_type(X,alnum),Lalnum),length(Lalnum,N).

和 SWI 的回答:

    Lalnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8'|...],
    N = 816459.

我很惊讶——为什么这么多?然后我决定检查纯'ascii'集 - 毕竟,根据文档页面:

    http://www.swi-prolog.org/pldoc/doc_for?object=char_type/2

其中只有 128 个(7 位字符集)。我的明显问题是:

     findall(X,char_type(X,ascii),Lascii),length(Lascii,N).

和 SWI 的回答:

    Lascii = ['\000\', '\001\', '\002\', '\003\', '\004\', 
    '\005\', '\006\', '\a', '\b'|...], 
    N = 2176.

我比以前更惊讶了……怎么了?问题出在哪里?我的问题?使用我的 SWI-prolog 安装?用我的系统?这是:

SWI Prolog 7.7.13, with ascii encoding:

    current_prolog_flag(encoding,X).
    X = ascii.

Win 8.1 64bit, with code page 852.

以及如何解决?

先感谢您

编辑:可能我已经找到了第二个问题的答案:“如何解决它”。看来,附加条款:

    sort(Lascii,SortedLascii)

删除重复并保留基本的 128 个字符集。

但我还是不明白为什么第一个子句会产生这么多结果......???

标签: character-encodingprologswi-prolog

解决方案


有这么多字符的原因是 Unicode。它将根据您当前的语言环境返回所有相关字符。

包括 Unicode:

仅限字母:

?- :(C, char_type(C, alpha), L), length(L, Len).                     
L = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'|...],
Len = 2568.

字母数字字符:

?- findall(C, char_type(C, alnum), L), length(L, Len).
L = ['0', '1', '2', '3', '4', '5', '6', '7', '8'|...],
Len = 2578.

现在只有ASCII:

仅限字母:

?- findall(C, (char_type(C, alpha), char_type(C, ascii)), L), length(L, Len).
L = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'|...],
Len = 52.

字母数字:

?- findall(C, (char_type(C, alnum), char_type(C, ascii)), L), length(L, Len).
L = ['0', '1', '2', '3', '4', '5', '6', '7', '8'|...],
Len = 62.

是什么导致了混乱?

因为返回的项目数量太多,所以输出被削减,省略的项目被省略号替换。更多细节在这里: https ://www.swi-prolog.org/FAQ/AllOutput.html

要更改此行为并查看完整输出,请使用以下配置选项:

set_prolog_flag(
    answer_write_options,
    [
        quoted(true),
        portray(true),
        spacing(next_argument)
    ]
),

这样,您将看到所有 Unicode 字符并且不会再感到困惑。请注意,与默认值的唯一区别是缺少max_depth(10).


推荐阅读