Как удалить гласные из заданной строки в прологе? - PullRequest
0 голосов
/ 07 мая 2019

Я хочу удалить вокал из строки в Прологе.

Я целый день искал помощи, но все, что я мог найти, это:

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 голосов
/ 08 мая 2019

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.
0 голосов
/ 08 мая 2019

Во-первых, обратите внимание, что ваш код, как есть, работает в 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|...].

Также обратите внимание, что то, что вы ищете уже доступно в библиотеке ( списки ):

?- 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).
0 голосов
/ 08 мая 2019

Я бы, вероятно, сделал что-то вроде этого (предполагая, что строка содержит только строчные буквы 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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...