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

もちろん、母音/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 に答える