1

与えられた文字列からすべての母音を削除する母音削除プログラム ( String、 ) を作成します。NoVowelsString

これまでのところ、私は条件を持っていますvowel(X):- member(X,[a,e,i,o,u])。次に、他のリストからすべての要素を削除するものを考えました。

delete2([],L1,L1).
delete2([H|T],L1,L3) :-
   delete2(H,L1,R2),
   delete2(T,R2,L3).

これらの 2 つがあれば、要素が のメンバーでなければならないという条件を削除することができると考えました[a,e,i,o,u]。まだ行き着いていないのに。

4

3 に答える 3

4

以下は、等号/不等号の具体化に基づいています。

まず、最初に を定義しますlist_memberd_t/3。これは と同じように動作しますmemberd_truth/3が、引数の順序が異なります。

list_memberd_t([]    ,_,false).
list_memberd_t([Y|Ys],X,Truth) :-
   if_(X=Y, Truth=true, list_memberd_t(Ys,X,Truth)).

list_memberd_truth(Xs,X,Truth) :- list_memberd_t(Xs,X,Truth).

簡潔にするために、にmemberd_t/3基づいて定義しましょうlist_memberd_t/3

memberd_t(X,Xs,Truth) :- list_memberd_t(Xs,X,Truth).

と同様に、 をlibrary(apply)定義しましょうtinclude/3:

:- meta_predicate tinclude(2,?,?).
tinclude(P_2,Xs,Zs) :- 
    list_tinclude_list(Xs,P_2,Zs).

list_tinclude_list([],   _P_2,[]).
list_tinclude_list([E|Es],P_2,Fs0) :-
    if_(call(P_2,E), Fs0 = [E|Fs], Fs0 = Fs),
    list_tinclude_list(Es,P_2,Fs).

tfilter/3の別名tinclude/3:

tfilter(P_2,As,Bs) :-
   tinclude(P_2,As,Bs).

texclude/3次に、の反対であるメタ述語 を定義しますtinclude/3

:- meta_predicate texclude(2,?,?).
texclude(P_2,Xs,Zs) :- 
    list_texclude_list(Xs,P_2,Zs).

list_texclude_list([],_,[]).
list_texclude_list([E|Es],P_2,Fs0) :-
    if_(call(P_2,E), Fs0 = Fs, Fs0 = [E|Fs]),
    list_texclude_list(Es,P_2,Fs).

さあ、一緒に使おう!

?- texclude(list_memberd_truth([a,e,i,o,u]),
            [d,e,l,e,t,e,' ',v,o,w,e,l,s,' ',i,n,' ',a,' ',l,i,s,t], Filtered).
Filtered  = [d,  l,  t,  ' ',v,  w,  l,s,' ',  n,' ',  ' ',l,  s,t].

編集

上記を使用する代わりに、補助述語を使用して真理値を反転texclude/3させてみましょう。tinclude/3not/3

:- meta_predicate not(2,?,?).
not(P_2,X,Truth) :-
   call(P_2,X,Truth0),
   truth_flipped(Truth0,Truth).

truth_flipped(true,false).
truth_flipped(false,true).

サンプルクエリ:

?- tinclude(not(list_memberd_truth([a,e,i,o,u])),
            [d,e,l,e,t,e,' ',v,o,w,e,l,s,' ',i,n,' ',a,' ',l,i,s,t], Filtered).
Filtered  = [d,  l,  t,  ' ',v,  w,  l,s,' ',  n,' ',  ' ',l,  s,t].
于 2015-04-30T09:05:04.717 に答える
1

ここでは DCG を使用したソリューションです。「出力」がどのように取得されるかに注意してください (引数は渡されず、差分リストのみ)

novowels --> ("a";"e";"i";"o";"u"), !, novowels.
% or ..
% novowels --> [C], {memberchk(C, "aeiou")}, !, novowels.
novowels, [C] --> [C], !, novowels.
novowels --> [].

2 番目のカットは気に入らないことを告白しなければなりませんが、必須のようです。

テスト:

?- phrase(novowels, "abcdefghilmnopq", L),format('~s',[L]).
bcdfghlmnpq
L = [98, 99, 100, 102, 103, 104, 108, 109, 110|...].

編集2 番目のカットについては、「左手」表記で必要なようです: カットなしで引数を指定してコーディングすると、正しい解析が得られます。

novowels(Cs) --> ("a";"e";"i";"o";"u"), !, novowels(Cs).
% novowels(Cs) --> [C], {memberchk(C, "aeiou")}, !, novowels(Cs).
novowels([C|Cs]) --> [C], novowels(Cs).
novowels([]) --> [].

テスト:

?- phrase(novowels(L), "abcdefghilmnopq"),format('~s',[L]).
bcdfghlmnpq
L = [98, 99, 100, 102, 103, 104, 108, 109, 110|...] ;
false.

これは DCG トランスレータのバグなのか、それとも (おそらく) 私のせいなのか...

于 2012-11-25T10:10:23.750 に答える
0

ここにコードがあります

deleteV([H|T],R):-member(H,[a,e,i,o,u]),deleteV(T,R),!.
deleteV([H|T],[H|R]):-deleteV(T,R),!.
deleteV([],[]).

それは何をしますか?まず自分自身に問いかけますか? 母音の頭です はい->無視します。いいえ->必要です。空のリストが見つかった場合は、結果リストを作成し、バックトラックから戻ったときに子音を先頭に追加します。このコードは SWIProlog でテストされました。

于 2012-11-23T23:51:11.990 に答える