prolog中csymf和csym的区别

prolog中csymf和csym的区别,prolog,swi-prolog,Prolog,Swi Prolog,我很困惑,当我使用prolog时,csymf和csym在prolog中的区别是什么 ?-code_type(X,csym). X = 48 ; X = 49 ; .... ?-code_type(X,csymf). X = 65; X = 66; .... 你能告诉我X应该是什么吗?我在这一部分阅读了SWI prolog手册,其中提到 csym :Char is a letter (upper- or lowercase), digit or the underscore (_). Th

我很困惑,当我使用prolog时,csymf和csym在prolog中的区别是什么

?-code_type(X,csym).

X = 48 ;
X = 49 ;
....

?-code_type(X,csymf).

X = 65;
X = 66;
....
你能告诉我X应该是什么吗?我在这一部分阅读了SWI prolog手册,其中提到

csym :Char is a letter (upper- or lowercase), digit or the underscore (_). These are valid C and Prolog symbol characters.

csymf :Char is a letter (upper- or lowercase) or the underscore (_). These are valid first characters for C and Prolog symbols.
你能给我举几个例子吗


谢谢

您已经找到了相关的说明,说明代码类型(code,type)在
字符代码
和他的
分类
之间存在关系

我认为手册有点误导,因为Prolog符号不同于C(或者说Java)符号。后者可以用正则表达式来描述,如
[\u a-zA-Z][\u a-zA-Z0-9]*
,相当于您引用的可读描述

然后
c9
是有效的C符号,而
9c
不是(数字不能开始符号)

要检查字符的所有“属性”(我假设您知道字符代码(整数)和编码字符(本地化)之间的差异),可以使用

?- char_type(v,T).
T = alnum ;
T = alpha ;
T = csym ;
T = csymf ;
T = ascii ;
T = graph ;
T = lower ;
T = lower('V') ;
T = to_lower('V') ;
T = to_upper(v) ;
false.
?- forall(char_type(X,csymf),write(X)).
ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
true.
然后
v
可以启动
C符号

?- char_type('7',T).
T = alnum ;
T = csym ;
T = ascii ;
T = digit ;
T = graph ;
T = to_lower('7') ;
T = to_upper('7') ;
T = digit(7) ;
T = xdigit(7).
我们错过了这里的
csymf
,然后
7
无法启动
C符号

?- char_type('7',T).
T = alnum ;
T = csym ;
T = ascii ;
T = digit ;
T = graph ;
T = to_lower('7') ;
T = to_upper('7') ;
T = digit(7) ;
T = xdigit(7).
要获取可以启动
C符号的所有字符,可以使用

?- char_type(v,T).
T = alnum ;
T = alpha ;
T = csym ;
T = csymf ;
T = ascii ;
T = graph ;
T = lower ;
T = lower('V') ;
T = to_lower('V') ;
T = to_upper(v) ;
false.
?- forall(char_type(X,csymf),write(X)).
ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzªµºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
true.

我认为您的结果可能与我的不同,这取决于您的区域设置。

不是区域设置给出了此结果。SWI的
char\u type/2
不是一个关系:
char\u type('\x100\',csymf)
成功,而
char\u type(C,csymf),C='\x100\'
失败<代码>\x100\
是具有适当区域设置的
“Ā”
。@false:感谢您的澄清。我在非拉丁语地区的经验是无效的,我在SWI文档中找不到更多详细信息…@false:sorry,但我尝试了这两种语言,没有失败:@false:sorry,但我尝试了,但没有失败:“code”?-char_type(“\x100\”,csymf)。对字符类型(“\x100\”,csym)。对。我正在使用SWI-prolog@false啊哈,很抱歉我第一次读时误解了,谢谢,请使用
char\u type/2
并注意只生成拉丁-1字符。然而,
char\u type/2
是为所有Unicode字符定义的。这是非常特定于SWI的。?-char_类型(A,cymf)。将给我所有可以用cymf键入的开头字母,包括大写字母和小写字母、下划线,还有?和一些拉丁字母字符类型(A,csym)。给我csym的所有起始字符,包括数字、大写字母或小写字母以及拉丁字符,所以我认为char_type(A,cymf)是char_type(A,cymf)的子集。谢谢你给我提供这样的谓词来使用。