从单词返回元音

时间:2014-05-29 09:32:34

标签: prolog

我有这项工作要做,我的老师给了我一个prolog文件,其中包含以下事实:

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

consonant(b).
consonant(c).
consonant(d).
consonant(f).
consonant(g).
consonant(h).
consonant(j).
consonant(k).
consonant(l).
consonant(m).
consonant(n).
consonant(p).
consonant(q).
consonant(r).
consonant(s).
consonant(t).
consonant(v).
consonant(w).
consonant(x).
consonant(y).
consonant(z).

我需要创建一个能够返回元音的规则。我怎么能这样做?

输出将是这样的:

blafoo([s,a,r,a], X).
X = [a].

我不能使用任何prolog谓词。

3 个答案:

答案 0 :(得分:2)

如果您的Prolog实现它,我将使用标准ISO sub_atom / 5

 ?- W = amazon, sub_atom(W, _,1,_, C).
W = amazon,
C = a ;
W = amazon,
C = m ;
...

然后

blafoo(Word, Wovel) :- sub_atom(Word, _,1,_, Wovel), vowel(Wovel).
评论

编辑

Prolog没有返回'事情,但你总是可以为关系使用更合适的命名和实现,例如

word_vowels(Word, Wovels) :-
  findall(Wovel, (sub_atom(Word, _,1,_, Wovel), vowel(Wovel)), Wovels).

答案 1 :(得分:2)

setof/3可能是个不错的选择:

?- setof(X,(member(X,[a,m,a,z,o,n]),vowel(X)),L).
L = [a, o].

答案 2 :(得分:1)

如果您同时提及vowel/1consonant/1,则可能需要编写一个纯粹的单调版本。毕竟,你为什么提到consonant/1

word_vowels([], []).
word_vowels([C|Xs], Vs) :-
   consonant(C),
   word_vowels(Xs, Vs).
word_vowels([V|Xs], [V|Vs]) :-
   vowel(V),
   word_vowels(Xs, Vs).

?- word_vowels([a,m,a,z,o,n],Vs).
Vs = [a,a,o] ;
false.

或者使用tfilter/3

vowel_truth(C,true) :-
   vowel(C).
vowel_truth(V,false) :-
   consonant(V).

?- tfilter(vowel_truth,[a,m,a,z,o,n],Vs).
Vs = [a,a,o] ;
false.