SWI prolog,char_type,ascii / alnum,为什么这么多的字符?怎么解决?

时间:2018-05-15 02:20:48

标签: character-encoding prolog swi-prolog

我只是想检查一下,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个字符集。

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

1 个答案:

答案 0 :(得分:1)

这么多字符的原因是Unicode。它将返回所有相关字符,具体取决于您当前的语言环境。

包括Unicode:

仅字母:

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

字母数字字符:

?- 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.

仅现在的ASCII:

仅字母:

?- 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.

字母数字:

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

是什么引起了混乱?

由于返回的项目数太多,因此将剪切输出,并将省略的项目替换为省略号。此处有更多详细信息: https://www.swi-prolog.org/FAQ/AllOutput.html

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

max_depth(10)

这样,您将看到所有Unicode字符,不会再感到困惑。 请注意,与默认设置的唯一区别是缺少http://internal-dummyelb-2-1122730003.ap-southeast-2.elb.amazonaws.com:80/