我有这项工作要做,我的老师给了我一个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谓词。
答案 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/1
和consonant/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.