2016-11-20 4 views
1

목록 길이를 계산하는 함수를 만들었습니다. 아래는 제 코드입니다.프롤로그 인수가 충분히 인스턴스화되지 않았습니다 (목록 길이를 계산하는 함수)

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

I 입력

이 코드를 실행하는 경우 - listLength를 ([1, 2, 3, 4, 5, 6, 7). 나는 다음과 같은 코드 위에 수정 된 경우

는, 인터프리터는 나에게 오류 메시지 solve/2 : Arguments are not sufficiently instantiated.

을 보였다. 다음 항상 0 기록 된

listLength(LIST) :- LENGTH is 0, solve(LIST, LENGTH), write(LENGTH). 
solve([], _). 
solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

내가 같은 입력이 코드를 실행

.

저는 LENGTH를 계산하고 싶습니다. listLength 함수에서 변수를 사용하고 싶습니다.

나에게 무슨 문제가 있습니까? (제발 swi-prolog를 사용하고 있습니다.)

답변

0

첫 번째 실수는 기본 경우입니다. solve([], _). 대신 solve([], 0).을 작성해야합니다. 빈 목록의 길이를 모르는 경우 큰 목록을 재귀 적으로 찾을 수 있기 때문입니다.

solve([_|T], LENGTH) :- ADD is LENGTH + 1, solve(T, ADD). 

하는 ADD를 계산하려고 할 때 길이 + 1 개 길이가 인스턴스화 계산되지이다 :

는 또 다른 문제가있다. 이제 쿼리

listLength(LIST) :- solve(LIST, LENGTH), write(LENGTH). 
solve([], 0). 
solve([_|T], LENGTH) :- solve(T, ADD), LENGTH is ADD+ 1. 

: 당신이 좋아하는 순서를 변경해야

?- listLength([1, 2, 3, 4, 5, 6, 7]). 
7 
true. 
+0

이 listLength'같은 쿼리 (L, 10000)에 대한 매우 느립니다' – false

+0

당신은 어떻게 조회 할 수 그것은 단지 하나의 걸리므로 그 매개 변수 목록 ?? – coder

+1

당신이 옳습니다! 나는 끝에 만 보았다. 'solve (L, 100000' bu 나는 그것을 인정한다. 그것은 일어나지 않을 것이다. – false