我想从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进行了测试
有人可以指导我做到这一点吗?
感谢百万次!
答案 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).