Prolog で、文字列のタイプがアルファベットか、英数字か、数字かを判断したいと思います。例えば:
"I use this page" alphabetic
"0c0d24e" alphanumeric
どのようにできるのか?
Prolog で、文字列のタイプがアルファベットか、英数字か、数字かを判断したいと思います。例えば:
"I use this page" alphabetic
"0c0d24e" alphanumeric
どのようにできるのか?
使用可能な述語はchar_type /2、またはより適切な code_type/2 です。文字列内の各コードに適用するには、maplist/2 を使用します。唯一の問題は、code_type の引数の順序が間違っていることです。次に、サービス述語が必要です (または、SWI-Prolog を使用している場合はlambda?- pack_install(lambda).
を とともにダウンロードします)。
ラムダなし:
code_type_(X,Y) :- code_type(Y,X).
?- maplist(code_type_(alpha), "abc").
true.
ラムダの場合:
?- [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+ の二重引用符は、文字コードのリストを表すものではなくなりました。