删除列表中的元音

编写一个程序,删除元音( StringNoVowelsString ),从给定的string中删除所有的元音。

到目前为止,我已经得到了条件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). 

所以有了这两个我想我可以把那些被删除的元素的条件,他们必须是[a,e,i,o,u] 。 虽然我还没有得到任何地方。

这是代码

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

它能做什么? 首先它质疑自己呢?这是头元音是 – >我们忽略它。 不 – >我们需要它。 如果它find一个空列表,它将构造结果列表,并且当从回溯返回时,它将前面的consonats附加。 此代码已在SWIProlog中进行了testing。

以下是基于术语平等/不平等的具体化 。

首先,我们首先定义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/3tinclude/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/3和辅助谓词not/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]. 

这里使用DCG的解决scheme。 注意如何获得“输出”(没有parameter passing,只有差异列表)

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

我必须承认第二次切不喜欢我,但似乎是必需的。

testing:

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

编辑关于第二次剪切,似乎需要“左手”符号:如果我用参数编码,没有剪切,我得到一个正确的parsing:

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

testing:

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

我想知道这是DCG翻译的错误,还是更可能是我的错…