2

Prolog で、文字列のタイプがアルファベットか、英数字か、数字かを判断したいと思います。例えば:

"I use this page" alphabetic

"0c0d24e" alphanumeric

どのようにできるのか?

4

1 に答える 1

3

使用可能な述語は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+ の二重引用符は、文字コードのリストを表すものではなくなりました。

于 2013-07-18T09:17:12.250 に答える