Как заменить гласные в списке подчеркиванием? - PullRequest
1 голос
/ 25 сентября 2011

У меня есть список символов (в основном слово), и я хочу заменить гласные в слове подчеркиванием ['_'] и вернуть новый список. например:

?-sub([s,e,g,e,d],A).  
 A=[s,_,g,_,d]

Моя попытка построить новый список в обратном порядке, а затем, когда он вышел из вызова предиката, он разбирает все и объявляет, что нашел цель без выходной строки!

Алгоритм, который я использовал: выбрать элемент списка и проверить, является ли он гласным или нет, и добавить ['_'] или сам элемент в новый список.

sub([],B).
sub([X|T1],Y):-
   ((vocal(X), append(['_'],Y,Z));
    (not(vocal(X)), append([X],Y,Z))),
    sub(T1,Z).

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2011

В SWI-прологе:

sub(In, Out) :-
    maplist(vowel_to_underscore, In, Out).

vowel_to_underscore(Vowel, '_') :-
    vocal(Vowel),
    !.
vowel_to_underscore(X, X).

vocal(a).
vocal(e).
vocal(i).
vocal(o).
vocal(u).
0 голосов
/ 25 сентября 2011

Первое, что вы должны сделать: обратите внимание на предупреждения.Конечно, компилятор предупредил вас о синглтоне в базовом случае рекурсии.

sub([], []).
sub([X|Xs], [Y|Ys]) :-
  (vocal(X), '_' = Y ; X = Y),
  !, sub(Xs, Ys).

Обратите внимание, что в Prolog символ = означает не назначение, а объединение.Вы должны понимать это и (если вы действительно хотите понять Пролог), почему ваше решение меняет ввод.Попробуй написать reverse / 2 by yoursef!

...