Replace 如何用下划线替换列表中的元音?

Replace 如何用下划线替换列表中的元音?,replace,prolog,substitution,Replace,Prolog,Substitution,我有一个字符列表(基本上是一个单词),我想用下划线[''.']替换单词中的元音,然后返回一个新列表。 例如: 我的尝试以相反的顺序构建了新的列表,最后当它从谓词调用中退出时,它拆除了所有内容,并声明它找到了没有输出字符串的目标 我使用的算法是:选择列表中的元素并检查它是否是元音,然后将[''.'或元素本身附加到新列表中 sub([],B). sub([X|T1],Y):- ((vocal(X), append(['_'],Y,Z)); (not(vocal(X)), append(

我有一个字符列表(基本上是一个单词),我想用下划线[''.']替换单词中的元音,然后返回一个新列表。 例如:

我的尝试以相反的顺序构建了新的列表,最后当它从谓词调用中退出时,它拆除了所有内容,并声明它找到了没有输出字符串的目标

我使用的算法是:选择列表中的元素并检查它是否是元音,然后将[''.'或元素本身附加到新列表中

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).

你应该做的第一件事:注意警告。 当然,编译器在递归的基本情况下警告过您关于单例的问题

sub([], []).
sub([X|Xs], [Y|Ys]) :-
  (vocal(X), '_' = Y ; X = Y),
  !, sub(Xs, Ys).
请注意,在Prolog中,=并不表示赋值,而是表示统一。您应该了解这一点,并且(如果您真的想了解Prolog)您的解决方案反转输入的原因。试着用你的SEF写反向/2

在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).

我已经知道了,下面就是它的发展过程。。。。子([],[])。sub([X|T1],A):-sub(T1,B),((有声(X),附加([X],B,A));(无声(X)),附加([X],B,A))。事实的声音和问题一样!!!希望这对其他人有用。。。干杯谢谢,这很有帮助,我还想出了另一个解决办法!!目标
sub([a],[a])
成功——它应该失败+1,虽然if-then-else比cut更干净。目标
sub([a],[a])
成功了——它应该失败!
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).