gpt4 book ai didi

prolog - 确定字符类型

转载 作者:行者123 更新时间:2023-12-04 04:49:02 27 4
gpt4 key购买 nike

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

"I use this page" alphabetic

"0c0d24e" alphanumeric

我该怎么办?

最佳答案

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

编辑

这个答案的更新是强制性的:因为 library(yall) 已经在 SWI-Prolog 中发布,并且是自动加载的,我们现在可以写:
?- maplist([C]>>code_type(C,alpha), `abc`).

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

关于prolog - 确定字符类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718401/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com