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

时间:2011-09-24 22:45:04

标签: replace prolog substitution

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

?-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 :(得分:0)

在SWI-Prolog中:

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

答案 1 :(得分:-1)

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

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

请注意,在Prolog中,=并不意味着分配,而是统一。您应该理解这一点(如果您真的想了解Prolog)为什么您的解决方案会改变输入。尝试用yoursef写反向/ 2!