Character encoding SWI prolog,字符类型,ascii/alnum,为什么有这么多字符?如何修复它?

Character encoding SWI prolog,字符类型,ascii/alnum,为什么有这么多字符?如何修复它?,character-encoding,prolog,swi-prolog,Character Encoding,Prolog,Swi Prolog,我只是想检查一下,chars 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. Lascii = ['\000\', '\001\', '\002\', '\003\', '\00

我只是想检查一下,chars 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.
    Lascii = ['\000\', '\001\', '\002\', '\003\', '\004\', 
    '\005\', '\006\', '\a', '\b'|...], 
    N = 2176.
我很惊讶——为什么这么多? 然后我决定检查纯“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的答案是:

    Lalnum = ['0', '1', '2', '3', '4', '5', '6', '7', '8'|...],
    N = 816459.
    Lascii = ['\000\', '\001\', '\002\', '\003\', '\004\', 
    '\005\', '\006\', '\a', '\b'|...], 
    N = 2176.
我比以前更惊讶了。。。 怎么了?问题在哪里? 我的问题是什么?使用我的SWI prolog安装?用我的系统? 它是:

如何修复它

先谢谢你

编辑: 也许我已经找到了第二个问题的答案:“如何修复它”。 似乎,该附加条款:

    sort(Lascii,SortedLascii)
删除重复并仅保留基本的128个字符集


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

产生这么多字符的原因是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, 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), L), length(L, Len).
L = ['0', '1', '2', '3', '4', '5', '6', '7', '8'|...],
Len = 2578.
现在仅限ASCII码: 仅限信件:

?- :(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, 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.
是什么引起了混乱? 因为返回的项目数量太多,所以输出被剪切,省略的项目被替换为省略号。详情如下:

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

set_prolog_flag(
    answer_write_options,
    [
        quoted(true),
        portray(true),
        spacing(next_argument)
    ]
),
这样,您将看到所有Unicode字符,不再感到困惑。
请注意,与默认设置的唯一区别是缺少
max_depth(10)

能否在ASCII findall查询的末尾添加
writeln(Lascii)
,并将(部分)输出添加到问题中?它可能会显示哪些字符被视为ASCII字符。排序结果表明SWI可能会多次枚举相同的字符,这会很奇怪。至于
alnum
部分,这可能是相关的。但是,还有很多
alnum
字符:
?-char\u类型('民', 阿尔纳姆)。没错。
你好@IsabelleNewbie-谢谢你的回答。我已尝试将查询结果保存到文件中-使用:tell('d:/results.txt')、tell、flush。检查该文件后,我发现ascii集(char(\000)…char(\1ff)只重复了17次,因此我收到了2176个字符(字节),而不是128个。同样的,当我保存所有其他字符类型(alnum、alpha、csym等)的查询结果时也是如此-例如,对于“alnum”,我有816459个字符,而不是48027个字符。我不知道这种重复是从哪里来的。。。