我只是想检查一下,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个字符集。
但我仍然不明白为什么第一个句子会产生这么多结果...... ???
答案 0 :(得分:1)
这么多字符的原因是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.
仅字母:
?- 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/
。