2016-12-13 5 views

답변

1

에 대한 설명은 참으로 매우 적합합니다. 모두가 솔루션

: 예를 들어

, 우리가 간단한 질문을 물어 보자?

 
?- nr_vowel(Ls, N). 
Ls = [], 
N = 0 ; 
Ls = [a], 
N = 1. 

흠 :

는 모든 인수가 신선한 변수이 어디 가장 일반적인 쿼리를 게시하여, 밖으로 밖으로보십시오! 아마 당신이 묘사하길 원하는 것이 아닙니다!

 
nr_vowel([], 0). 
nr_vowel([X|T], N):- 
     vowel(X), 
     nr_vowel(T,N1), 
     N #= N1+1. 
nr_vowel([X|T], N):- 
     nr_vowel(T,N). 

그런 다음 우리가 얻을 :

 
?- nr_vowel(Ls, N). 
Ls = [], 
N = 0 ; 
Ls = [a], 
N = 1 ; 
Ls = [a, a], 
N = 2 ; 
Ls = [a, a, a], 
N = 3 ; 
etc. 

더 잘 보이는

그래서 나는 당신의 코드를 변경!

어때 대략 공정한 열거? 보자 :

 
?- length(Ls, _), nr_vowel(Ls, N). 
Ls = [], 
N = 0 ; 
Ls = [a], 
N = 1 ; 
Ls = [e], 
N = 1 ; 
Ls = [i], 
N = 1 ; 
Ls = [o], 
N = 1 ; 
Ls = [u], 
N = 1 ; 
Ls = [_2006], 
N = 0 ; 
Ls = [a, a], 
N = 2 ; 
Ls = [a, e], 
N = 2 . 

처음 몇 대답은 모든 것을 Ls = [_2006], N = 0에 대한 유망한 보이지만?

이것은 분명히 입니다.!

너무 일반적으로 대답하지 않으려면 프로그램 으로 지정해야합니다.

 
?- nr_vowel([X], N), X = a. 
X = a, 
N = 1 ; 
X = a, 
N = 0. 

Whaaat : 여기

는 한마디에 문제가? a 모음인데, 왜 N = 0 ?? 그것은 작은 마디 여기

이다

 
?- nr_vowel([a], 0). 
true. 

Whaaaaat는 ??

연습용으로 술어에 제약을 적절하게 추가해 둡니다.

0

코드는 그 자체로 단순합니다. 목록의 모음 수를 계산합니다 (추측은 분명합니다).

하는 예로 들어 입력을 보자, 목록 [A, T, I, K]

당신은 ([A, T, I, K, Z), 프롤로그 검색 nr_vowel를 호출 할 때 에 대한 쿼리를 두 번째 nr_vowel 절과 통합하면 비어 있지 않은 목록 입력이있는 첫 번째 절이되기 때문입니다.

이제 모음 (a) nr_vowel 호출 다음 술어 ([t, I, K를, Z)에에 true를 반환하므로 프롤로그 이동한다. 그러나 프롤로그가 두 번째 nr_vowel과 통합하려고하면 모음 (t)이 false를 반환하므로 세 번째 절과 통합되어 목록이 비어있을 때까지 유사하게 동작합니다.

목록이 비게되자 마자 프롤로그는 Z를 0으로 통합하고 재귀 수준을 시작하며 호출자 술어에 모음이 있는지 여부에 따라 N = N + 1을 수행하고 순환 체인의 상단은, Z가 간단히 N.

의 최종 값으로 통일된다 -

N = N +리스트의 헤드가 모음 인 경우 (1)가 발생

N = N, 즉 목록 머리글이 모음이 아닌 경우 변경되지 않습니다.

관련 문제