-3

我不熟悉 Prolog,当我使用下面的代码时,我得到的输出为“false”

cvowel([],0).
vowel([a],Counter):-Counter is 1.
vowel([e],Counter):-Counter is 1.
vowel([i],Counter):-Counter is 1.
vowel([o],Counter):-Counter is 1.
vowel([u],Counter):-Counter is 1.
vowel([_];[],Counter):-Counter is 0.
cvowel([H|T],Counter1):-cvowel(T,Count),vowel(H,Counter),Count is Count
+Counter,Counter1 is Counter1+Count.
4

1 回答 1

2

让我们来看看:

a) 相同程序的子句应该放在一起

cvowel([],0).
cvowel([H|T],Counter1):-
  cvowel(T,Count),
  vowel(H,Counter),
  Counter1 is Counter+Count.
  /* this is plain wrong: can be true only when Count,Counter and Counter1 are 0
  Count is Count+Counter,Counter1 is Counter1+Count
  */

b)这几乎是一个语法错误:Prolog 语法不严格,因此您的编译器无法以合理的方式抱怨

vowel([_];[],Counter):-Counter is 0.

vowel/2 可以简化 - 相当于你的代码 - 像这样

vowel([a],1).
vowel([e],1).
...
vowel([_],0).

当然,将列表作为 vowel/2 的第一个参数似乎也是错误的......

c)我认为更简单的代码总是更好:考虑一种更具声明性的方法

vowel(a).
vowel(e).
...
% !! must NOT have vowel(_) !!

cvowel([H|T], Count) :-
 cvowel(T, Rest),
 (vowel(H) -> Count is Rest + 1 ; Count is Rest).
cvowel([], 0).
于 2013-06-26T08:46:42.710 回答