如何从Prolog中的给定字符串中删除元音?

时间:2019-05-07 18:47:43

标签: prolog

我想从Prolog中的弦乐中删除人声。

我整天都在寻求帮助,但我能找到的只是这个。

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

这对我不起作用。 我用SWI-Prolog进行了测试

有人可以指导我做到这一点吗?

感谢百万次!

3 个答案:

答案 0 :(得分:0)

我可能会做这样的事情(假设字符串仅包含小写ASCII字母):

remove_vowels( []     , []    ) .
remove_vowels( [C|Cs] ,    L  ) :- vowel(c), !, remove_vowels(Cs,L) .
remove_vowels( [C|Cs] , [C|L] ) :-              remove_vowels(Cs,L) .

vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).

答案 1 :(得分:0)

DCG的工作原理:

vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).
vowel(y).

remove_vowels([A|T]) --> {vowel(A)}, remove_vowels(T).
remove_vowels([A|T]) --> {\+vowel(A)}, [A], remove_vowels(T).
remove_vowels([]) --> [].

例如:

?- string_chars("i like prolog", L), phrase(remove_vowels(L), R, []).
L = [i, ' ', l, i, k, e, ' ', p, r|...],
R = [' ', l, k, ' ', p, r, l, g] ;
false.

答案 2 :(得分:0)

首先,请注意,您的代码按原样可以在SWI-Prolog中工作:

?- [user].
|: deleteV([H|T],R):-member(H,[a,e,i,o,u]),deleteV(T,R),!.
|: deleteV([H|T],[H|R]):-deleteV(T,R),!.
|: deleteV([],[]).
% user://1 compiled 0.00 sec, 3 clauses

?- atom_chars(an_Atom_with_Mixed_case,Cs), deleteV(Cs,D).
Cs = [a, n, '_', 'A', t, o, m, '_', w|...],
D = [n, '_', 'A', t, m, '_', w, t, h|...].

另外,请注意,what you're after在库(lists)中已经可用:

?- atom_chars(an_Atom_with_Mixed_case,Cs), subtract(Cs,[a,e,i,o,u],D).
Cs = [a, n, '_', 'A', t, o, m, '_', w|...],
D = [n, '_', 'A', t, m, '_', w, t, h|...].

现在,您可以将您的实现与SWI-Prolog的实现进行比较。如果您正在运行IDE,请尝试

?- edit(subtract).