确定字符的类型

时间:2013-07-18 08:30:46

标签: prolog

我想在Prolog中确定一串字符的类型,如果它是字母,字母数字或数字。 例如:

"I use this page" alphabetic

"0c0d24e" alphanumeric

我该怎么办?

1 个答案:

答案 0 :(得分:3)

可用的谓词是char_type / 2,或更好,code_type / 2。 要应用于字符串中的每个代码,请使用maplist / 2。唯一的问题是code_type的错误参数顺序。然后需要服务谓词(或者如果您使用SWI-Prolog,则?- pack_install(lambda).下载lambda

没有lambda:

code_type_(X,Y) :- code_type(Y,X).

?- maplist(code_type_(alpha), "abc").
true.

使用lambda:

?- [library(lambda)].
?- maplist(\C^code_type(C,alpha), "abc").
true.
注释后

编辑,显然需要更灵活的解析。 DCG是推荐的方式:库(dcg/basics)提供一些预建的“分类程序”,并突出显示自己编写自己的正确方法,结合code_type:例如,这是最近添加的规则:

%%  prolog_var_name(-Name:atom)// is semidet.
%
%   Matches a Prolog variable name. Primarily  intended to deal with
%   quasi quotations that embed Prolog variables.

prolog_var_name(Name) -->
    [C0], { code_type(C0, prolog_var_start) }, !,
    prolog_id_cont(CL),
    { atom_codes(Name, [C0|CL]) }.

prolog_id_cont([H|T]) -->
    [H], { code_type(H, prolog_identifier_continue) }, !,
    prolog_id_cont(T).
prolog_id_cont([]) --> "".

了解code_type / 2如何用于限定单个字符...

更多编辑 - 注意:未经测试

qualify_atom(Atom, Type) :-
   atom_codes(Atom, Codes),
   qualify_codes(Codes, Type).

qualify_codes(Codes, Type) :-
   (  maplist(code_type_(alnum), Codes)
   -> Type = alnum
   ;  maplist(code_type_(alpha), Codes)
   -> Type = alpha
   ;  Type = unknown
   ).

然后,处理列表

?- maplist(qualify_atom, Atoms, Types).

修改

此答案的更新是强制性的:由于库(yall)已在SWI-Prolog中发布,并且已自动加载,我们现在可以写:

?- maplist([C]>>code_type(C,alpha), `abc`).

另外,请注意文字表示的变化:SWI-Prolog ver.7 +中的双引号不再代表字符代码列表。