2014-01-30 7 views
1

전 프롤로그를 처음 사용했습니다. 목록 목록의 크기를 계산하는 함수를 구현하고 싶습니다. 예를 들어 [[1,2,3],[a,b,c],[12,ab]]이 있고 반환되는 값은 8이어야합니다. 그래서 나는이 코드를 가지고 :따라 매개 변수를 전달하는 방법

size([], _). 
    size([_|T], X):- X1 is X + 1, size(T, X1). 

    total_size([], X):- write('size = '), write(X). 
    total_size([H|T], X):- size(H, X), total_size(T, X). 

을하지만 내 기능 0 모든 시간을 반환합니다. 내 계획은 을 호출 할 때마다 Xsize 함수에 전달하고 X 값을 증가시키는 것입니다. 쿼리는 다음과 같습니다 내가 잘못 뭐하는 거지

?- total_size([[1,2,3],[a,b,c],[12,ab]], 0).

?

코르 넬리에게 사전에

PS 감사 : 나는 어느 곳에서든지 "프롤로그"근처 단어 "기능을"사용 안하고 알고있다.

+1

옙. 논리적 "관계"를 표현하는 "술어"입니다. 그들은 "값"을 반환하는 "함수"가 아닙니다. 그것은 단지 명명법 일이 아닙니다. :) – lurker

+0

당신도 할 수있다 :'total_size (L, X) : - flatten (L, LF), length (LF, X) .' – lurker

+0

@mbratch : 대단히 감사합니다. 당신의 솔루션은 잘 작동합니다. 답변을 작성하고 보상을 받으시겠습니까? 그렇게한다면, 나는 해결책으로 표시 할 것입니다. 그렇지 않다면 나는 내 자신의 질문에 대답 할 것이다. 추신 : 나는 합법성 (술어, 관계, 기능)에 관심이 없다. 프롤로그를 발명 한 사람들은 분명히 당신이 선호하는 masochistic sadists 또는 sadistic masochists의 무리입니다. – corneliu

답변

0

크기를 생각하면/2 값을 '반환'할 수 있습니다. 값은 매개 변수를 바인딩 할 때만 '반환'할 수 있습니다 (우리는 매개 변수를 호출합니다). 그런 다음 첫 번째 단계는 첫 번째 절을 수정해야합니다 ('코드'라고 부름).

size([], 0). 

빈 목록이 크기가 말하는, 관계입니다 0

이제 재귀 단계는 또한 해결할 수 있습니다 : 그것은 것입니다 다음 사용 재귀 호출의 가치,

편집,

size([_|T], X):- size(T, X1), X is X1 + 1. 

당신이 볼 수있는 내 버그 값 '플로를 수정 w back '을 계산합니다.

total_size/2 계산 된 값이 재귀의 끝에 표시되어야하기 때문에 (실제로 루프입니다.) 계산 된 값은 호출을 '처리'합니다. 그냥 크기/2로 반환 된 값을 추가하는 것을 잊었습니다.

total_size([], X):- write('size = '), write(X). 
total_size([H|T], SoFar):- size(H, X), Sum is SoFar + X, total_size(T, Sum). 
+0

답변 해 주셔서 감사합니다.하지만 코드에 오류가 있다고 생각합니다. 만약 내가 그것을 실행하려고하면, swipl은 에러를 던진다 :'인자가 충분하게 인스턴스화되지 않았다'나는 X1이 2 행에서 인스턴스화되지 않고 X가 4 행에서 인스턴스화되지 않았기 때문에 추측한다. 어떤 컴파일러를 사용하는지 모른다. 나는 스윕을 사용해야합니다. – corneliu

+0

사면, 벌레를 죽일거야 ... – CapelliC

+0

고마워. 귀하의 솔루션은 현재 잘 작동합니다. – corneliu

관련 문제