如何从此规则中删除!
才能使其正常工作?
extractvowels([],[]).
extractvowels([H|T],R):-consonant(H),extractvowels(S,R),!.
extractvowels([H|T],[H|R]):-extractvowels(S,R),!.
consonant(H)
包含所有辅音。
如何在distinct
内加入此规则(extractvowels
)?
member(X, [X|_]).
member(X, [_|Tail]) :- member(X, Tail).
distinct([],[]).
distinct([H|T],C) :- member(H,T), distinct(T,C),!.
distinct([H|T],[H|C]) :- distinct(T,C).
我不能使用任何prolog谓词。
答案 0 :(得分:1)
这并没有直接解决你的问题,谢尔盖已经回答了这个问题,而是提出了一种编程风格'试图避免'样板'代码,有时 - 削减。
考虑这个简单的查询 - 它是简单的Prolog(除了扩展字符串表示法,“hello world”,特定于SWI-Prolog),并且可以在一行中解决:
?- S=`hello world`, findall(C, (member(C, S), C > 0'a, C =< 0'z, \+ memberchk(C, `eiou`)), Cs), format('~s~n', [Cs]).
hllwrld
S = [104, 101, 108, 108, 111, 32, 119, 111, 114|...],
Cs = [104, 108, 108, 119, 114, 108, 100].
有趣的是要注意:看看findall / 3中的member / 2如何充当lambda表达式和搜索空间生成器,允许命名变量 - 我们可以称之为& #39;当地环境&#39; - 然后允许Prolog发挥最佳 - 解决条款。
一般而且简单,不是吗?
答案 1 :(得分:0)
这应该有效:
extractvowels([], []).
extractvowels([H|T], R) :- consonant(H), extractvowels(T, R).
extractvowels([H|T],[H|R]) :- \+ consonant(H), extractvowels(T, R).
我修复了你的单身变量&#39; S&#39; - 改为&#39; T&#39; (SWI-Prolog可能会抱怨这个,你应该修复任何单例变量警告)。
您上次extractvowels
剪切(&#39;!&#39;)可能会被删除 - 最后一个句子末尾的剪切无效。
为了摆脱第一次切入,我添加了一个&#34;后卫&#34;规则\+ consonant(H)
到最后extractvowels
子句 - 仅当H不是辅音时才继续。
答案 2 :(得分:-1)
假设你的“元音”的定义是“不是辅音的”(有很多字符,大部分都不是元音,也不是辅音),如果用“提取元音”,你的意思是
删除所有元音,只留下辅音
然后这样的事情会起作用:
consonants_in( [] , [] ) .
consonants_in( [X|Xs] , [X|R] ) :- consonant(X) , consonants_in(Xs,R) .
consonants_in( [X|Xs] , R ) :- \+ consonant(X) , consonants_in(Xs,R) .
你也可以这样说:
consonants_in( [] , [] ) .
consonants_in( [X|Xs] , R ) :-
( consonant(X) -> R = [X|R1] ; R = R1 ) ,
consonants_in( Xs , R1 )
.
如果另一方面,如果通过“提取元音”,则表示
删除所有辅音,只留下元音
然后你想要反转,比如
vowels_in( [] , [] ) .
vowels_in( [X|Xs] , [X|R] ) :- \+ consonant(X) , vowels_in(Xs,R) .
vowels_in( [X|Xs] , R ) :- consonant(X) , vowels_in(Xs,R) .
或
vowels_in( [] , [] ) .
vowels_in( [X|Xs] , R ) :-
( consonant(X) -> R = R1 ; R = [X|R1] ) ,
vowels_in( Xs , R1 )
.
你可以通过明确定义“元音”来使事情更具说明性:
vowel(C) :- \+ consonant(C) .
并相应地更改谓词:
vowels_in( [] , [] ) .
vowels_in( [X|Xs] , [X|R] ) :- vowel(X) , vowels_in(Xs,R) .
vowels_in( [X|Xs] , R ) :- \+ vowel(X) , vowels_in(Xs,R) .
或
vowels_in( [] , [] ) .
vowels_in( [X|Xs] , R ) :-
( vowel(X) -> R = [X|R1] ; R = R1 ) ,
vowels_in( Xs , R1 )
.
这样做的好处是您可以稍后修改“元音”的定义,以便更正确,
vowel(a).
vowel(e).
vowel(i).
vowel(o).
vowel(u).
不影响其余部分或代码: