Character encoding SWI prolog,字符类型,ascii/alnum,为什么有这么多字符?如何修复它?
我只是想检查一下,chars SWI prolog将什么视为“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
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个字符。我不知道这种重复是从哪里来的。。。