如何更改此规则?

时间:2014-06-12 02:25:50

标签: prolog

如何从此规则中删除!才能使其正常工作?

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谓词。

3 个答案:

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

不影响其余部分或代码: