首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定字符类型

确定字符类型
EN

Stack Overflow用户
提问于 2013-07-18 16:30:46
回答 1查看 490关注 0票数 2

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

代码语言:javascript
复制
"I use this page" alphabetic

"0c0d24e" alphanumeric

我该怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-18 17:17:12

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

不使用lambda:

代码语言:javascript
复制
code_type_(X,Y) :- code_type(Y,X).

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

使用lambda:

代码语言:javascript
复制
?- [library(lambda)].
?- maplist(\C^code_type(C,alpha), "abc").
true.

在注释之后编辑,显然需要更灵活的解析。这是推荐的方式:库(dcg/basics)提供了一些预先构建的‘分类器’,并强调了结合code_type编写自己的正确方法:例如,下面是最近添加的规则:

代码语言:javascript
复制
%%  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是如何用来限定单个字符的...

更多编辑-注:未测试

代码语言:javascript
复制
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
   ).

然后,处理一个列表

代码语言:javascript
复制
?- maplist(qualify_atom, Atoms, Types).

编辑

这个答案的更新是必须的:由于库(Yall)已经在SWI-Prolog中发布,并且是自动加载的,我们现在可以这样写:

代码语言:javascript
复制
?- maplist([C]>>code_type(C,alpha), `abc`).

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17718401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档