使用 SWI-Prolog 生成数字时
code_type(X,digit).
结果是预期的ASCII http://www.asciitable.com/字符代码和
178 (0xB2) ²
179 (0xB3) ³
185 (0xB9) ¹
e.g.
code_type(X,digit).
X = 48 ;
X = 49 ;
X = 50 ;
X = 51 ;
X = 52 ;
X = 53 ;
X = 54 ;
X = 55 ;
X = 56 ;
X = 57 ;
X = 178 ;
X = 179 ;
X = 185 ;
false.
如何禁用或更改该功能以使 0-9 以外的字符不是数字?
显然我可以编写一个不同的例程,但我想知道是否没有一些选项或语句可以执行此操作。
TL;DR
Version
SWI-Prolog (Multi-threaded, 32 bits, Version 7.2.3)
SWI-Prolog 标志
current_prolog_flag(Name,Value).
query_debug_settings: debug(false,false)
save_history: true
debug: false
generate_debug_info: true
verbose_load: silent
emulated_dialect: swi
sandboxed_load: false
optimise: false
toplevel_var_size: 1000
allow_dot_in_atom: false
toplevel_prompt: ~m~d~l~! ?-
toplevel_print_anon: true
access_level: user
verbose_autoload: false
toplevel_extra_white_line: true
gui: true
timezone: 18000
verbose_file_search: false
char_conversion: false
history: 25
colon_sets_calling_context: true
verbose: normal
traditional: false
agc_margin: 10000
encoding: text
readline: false
break_level: 0
xpce: true
write_attributes: ignore
answer_format: ~p
quasi_quotations: true
bounded: false
min_tagged_integer: -16777216
integer_rounding_function: toward_zero
gmp_version: 5
xpce_version: 6.6.66
dde: true
gc: true
write_help_with_overstrike: false
user_flags: silent
address_bits: 32
max_tagged_integer: 16777215
allow_variable_name_as_functor: false
editor: pce_emacs
debug_on_error: true
shared_object_extension: dll
xpce_threaded: true
resource_database: c:/program files (x86)/swipl/boot32.prc
debugger_show_context: false
character_escapes: true
shared_object_search_path: PATH
iso: false
large_files: true
debugger_write_options: [quoted(true),portray(true),max_depth(10),attributes(portray),spacing(next_argument)]
pipe: true
c_cflags:
open_shared_object: true
threads: true
unload_foreign_libraries: false
home: c:/program files (x86)/swipl
prompt_alternatives_on: determinism
system_thread_id: 12492
dialect: swi
pid: 9796
executable: C:\Program Files (x86)\swipl\bin\swipl-win.exe
c_cc: gcc
last_call_optimisation: true
qcompile: false
warn_override_implicit_import: true
unknown: error
c_ldflags:
print_write_options: [portray(true),quoted(true),numbervars(true)]
c_libs:
c_libplso: -lswipl
max_arity: unbounded
report_error: true
trace_gc: false
autoload: true
answer_write_options: [quoted(true),portray(true),max_depth(10),spacing(next_argument)]
debug_term_position: false
back_quotes: codes
occurs_check: false
compile_meta_arguments: false
os_argv: [C:\Program Files (x86)\swipl\bin\swipl-win.exe,--win_app]
argv: []
emacs_inferior_process: false
cpu_count: 4
file_name_variables: false
color_term: true
version_data: swi(7,2,3,[])
hwnd: 924196
version_git: 7.2.3
console_menu: true
toplevel_residue_vars: false
double_quotes: string
stream_type_check: loose
windows: true
fileerrors: true
version: 70203
signals: true
arch: i386-win32
toplevel_print_factorized: false
compiled_at: Aug 25 2015, 13:45:56
tty_control: true
SWI-Prolog 语言环境
current_locale(X).
X = default.
locale_property(X,Y).
X = default,
Y = alias(default) ;
X = default,
Y = decimal_point('.') ;
X = default,
Y = thousands_sep(',') ;
X = default,
Y = grouping([repeat(3)]).
Windows
Windows PowerShell
PS C:\> Get-UICulture
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States)
PS C:\> Get-CimInstance Win32_OperatingSystem | FL *
Status : OK
Name : Microsoft Windows 10 Pro|C:\WINDOWS|\Device\Harddisk0\Partition4
FreePhysicalMemory : 853644
FreeSpaceInPagingFiles : 7062504
FreeVirtualMemory : 2415552
Caption : Microsoft Windows 10 Pro
InstallDate : 8/4/2016 8:35:18 AM
CreationClassName : Win32_OperatingSystem
CSCreationClassName : Win32_ComputerSystem
CurrentTimeZone : -300
LastBootUpTime : 1/11/2017 1:41:34 PM
LocalDateTime : 1/14/2017 3:48:46 PM
MaxNumberOfProcesses : 4294967295
MaxProcessMemorySize : 137438953344
OSType : 18
Version : 10.0.14393
BuildNumber : 14393
BuildType : Multiprocessor Free
CodeSet : 1252
CountryCode : 1
DataExecutionPrevention_32BitApplications : True
DataExecutionPrevention_Available : True
DataExecutionPrevention_Drivers : True
DataExecutionPrevention_SupportPolicy : 2
Debug : False
Locale : 0409
Manufacturer : Microsoft Corporation
MUILanguages : {en-US}
OperatingSystemSKU : 48
Organization : Windows User
OSArchitecture : 64-bit
OSLanguage : 1033
OSProductSuite : 256
PortableOperatingSystem : False
Primary : True
ProductType : 1
ServicePackMajorVersion : 0
ServicePackMinorVersion : 0
SuiteMask : 272
SystemDirectory : C:\WINDOWS\system32
SystemDrive : C:
WindowsDirectory : C:\WINDOWS
Output
code_type(X,digit).
X = 48 ;
X = 49 ;
X = 50 ;
X = 51 ;
X = 52 ;
X = 53 ;
X = 54 ;
X = 55 ;
X = 56 ;
X = 57 ;
X = 178 ;
X = 179 ;
X = 185 ;
false.
X is 0'².
X = 178.
X is 0'³.
X = 179.
X is 0'¹.
X = 185.
code_type(47,digit).
false.
code_type(48,digit).
true.
code_type(0'0,digit).
true.
code_type(57,digit).
true.
code_type(58,digit).
false.
code_type(0'9,digit).
true.
code_type(177,digit).
false.
code_type(178,digit).
true.
code_type(179,digit).
true.
code_type(180,digit).
false.
code_type(184,digit).
false.
code_type(185,digit).
true.
code_type(186,digit).
false.
char_type(X,digit).
X = '0' ;
X = '1' ;
X = '2' ;
X = '3' ;
X = '4' ;
X = '5' ;
X = '6' ;
X = '7' ;
X = '8' ;
X = '9' ;
X = ² ;
X = ³ ;
X = ¹ ;
false.
我尝试/检查过的内容
2.4 命令行选项 http://www.swi-prolog.org/pldoc/man?section=cmdline
代码类型/2 http://www.swi-prolog.org/pldoc/man?predicate=code_type/2
与 char_type/2 相同,但使用字符代码而不是单字符
原子。请注意,这两个谓词都尽可能灵活。
如果参数被实例化并且
仅使用整数代码或单字符原子实例化,
取决于所使用的版本。另请参见 Prolog 标志 double_quotes,
atom_chars/2 和atom_codes/2。
字符类型/2 http://www.swi-prolog.org/pldoc/man?predicate=char_type/2
测试或生成替代类型或字符。
字符类型的灵感来自于标准 C<ctype.h>
基元。
char_type(?Char,?类型)
数字 - Char 是一个数字。
2.15.1.8 Unicode Prolog 源代码 http://www.swi-prolog.org/pldoc/man?section=unicodesyntax
SWI-Prolog Unicode 字符分类基于版本
Unicode 标准 6.0.0。请注意 char_type/2 和朋友,旨在与除 Prolog 源代码之外的所有文本一起使用,
基于 C 库的基于区域设置的分类例程。
但不知道如何找到C library locale-based classification routines
我使用 Google 搜索swi prolog code_type digit 178
然而没有任何解释这一点的现象出现。
2.18 宽字符支持 http://www.swi-prolog.org/pldoc/man?section=widechars
SWI-Prolog 支持宽字符、带字符代码的字符
超过 255 无法用单个字节表示。普遍的
字符集 (UCS) 是 ISO/IEC 10646 标准,指定
任何语言中任何字符的唯一 31 位无符号整数。它
是 16 位 Unicode 的超集,而 Unicode 又是
ISO 8859-1 (ISO Latin-1),US-ASCII 的超集。 UCS可以处理字符串
保存多种语言的字符,以及字符
分类(大写、小写、数字等)和操作
因为大小写转换已明确定义。
ISO/IEC 10646 https://en.wikipedia.org/wiki/Universal_Coded_Character_Set - 统一码6.0 http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt
0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;;
0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;;
0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;;
0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;;
0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;;
0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;;
0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;;
0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;;
00B2;SUPERSCRIPT TWO;No;0;EN;<super> 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;;
00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;;
00B9;SUPERSCRIPT ONE;No;0;EN;<super> 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;;
ISO 8859-1 https://en.wikipedia.org/wiki/ISO/IEC_8859-1#Codepage_layout
Shows ¹
,²
,³
US-ASCII https://en.wikipedia.org/wiki/ASCII
不同版本的 Windows 操作系统和/或 SWI-Prolog
我也卸载了32位版本并安装了64位版本
SWI-Prolog (Multi-threaded, 64 bits, Version 7.2.3
仍然是相同的结果。
我还在另一台从未安装过 SWI-Prolog 的 Windows 10 计算机上安装了 64 位版本,但结果仍然相同。
我检查了旧版本SWI-Prolog (Multi-threaded, 64 bits, Version 6.4.1)
在Windows 7 Ultimate Version 6.1.7601上运行,结果仍然相同。
其他参考资料
SWI-Prolog 源代码在GitHub https://github.com/SWI-Prolog/swipl-devel
src/os/pl-ctype.c https://github.com/SWI-Prolog/swipl-devel/blob/98b0de257f613b66833fc4c744e50cca98d1f74c/src/os/pl-ctype.c#L42
This module defines:
char_type(?Char, ?Type)
code_type(?Char, ?Type)
Windows-1252 https://en.wikipedia.org/wiki/Windows-1252
解决方法
很多人并没有意识到这一点,因为它仍然存在beta但使用 Windows 10 64 位,您可以运行 Ubuntu 软件包并在名为“Windows 子系统”的 Windows 子系统上执行其他 Ubuntu 操作Windows 上 Ubuntu 上的 Bash https://msdn.microsoft.com/en-us/commandline/wsl/about, 也叫作Linux 的 Windows 子系统.
安装后WSL https://msdn.microsoft.com/en-us/commandline/wsl/install_guide然后按照说明进行操作从 PPA(Ubuntu 个人包存档)安装 http://www.swi-prolog.org/build/PPA.txt启动 SWI-Prolog,我得到了预期的输出。
findall(C,char_type(C,digit),Cs).
Cs = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].