39검증 문제
FSM 동작 네 번 반복하기
1. 문제와 수정 범위
repeatIncrement는 같은 증가 동작을 정확히 네 번 실행한 뒤 끝나야 합니다. 반복 본문의
레지스터 대입은 실행될 때마다 정확히 1을 더하므로 결함이 아닙니다. 결함은 반복 횟수를
정하는 부분에 있습니다. 초깃값 0에서 starter의 상태 변화는 0 -> 1 -> 2 -> 3에서
끝납니다.
함수 시그니처, 두 seq의 중첩 구조, 증가식, mkTop은 그대로 두세요. 본문을 몇 번
실행할지 정하는 선언만 수정합니다.
2. starter 읽기와 실행 전 예측
repeatIncrement를 바깥에서 안쪽으로 읽어 보세요.
- 함수는
Stmt를 반환합니다. - 바깥
seq안에repeat제어가 있습니다. - 안쪽
seq에는 증가 대입 하나가 있습니다. mkTop은 반환된Stmt로 controller를 만들고, 완료된 뒤count를 출력합니다.
실행 전에 출력될 최종값과 본문이 실행된 횟수를 따로 예측해 보세요. starter는
count = 3을 출력합니다. 대입을 하나 더 붙이면 이번 출력만 맞을 뿐, "같은 동작을 네 번
반복한다"는 계약은 표현하지 못합니다.
3. 최소 수정과 완료 조건
반복 한 번은 count <= count + 1의 실행과 반영을 하나 만듭니다. 같은 본문을 네 번
실행하면 됩니다. 본문 복제, 대입 추가, 최종 상수 쓰기는 최소 수정이
아닙니다.
수정한 뒤 실행 전에 0 -> 1 -> 2 -> 3 -> 4를 적고, 화살표마다 서로 다른 본문
실행인지 확인해 보세요. controller는 마지막 쓰기가 반영된 뒤에만 완료되어야 합니다.
finish가 controller 완료를 관찰하는 순간 count는 4여야 합니다. 세 번에서 멈추는
것도, 다섯 번까지 가는 것도 실패입니다. controller는 멈추지 않고 완료까지 진행해야 하며,
4는 직접 쓴 상수가 아니라 네 번 증가한 결과여야 합니다.
4. 단계형 힌트
힌트 1: 본문과 반복 제어 나누기
본문은 실행될 때마다 이미 1을 더합니다. 필요한 상태 전이 수와 controller가 본문을 실행하는 횟수를 비교해 보세요.
힌트 2: 하나 모자란 값의 위치
안쪽 seq의 대입이 아니라 repeat에 붙은 횟수 표현을 보세요. 본문 안에 동작을 더할
필요는 없습니다.
힌트 3: 유지할 구조
repeat는 고정된 작업량을 표현합니다. 증가식이나 FSM의 시작과 종료 구조는 그대로 두고
반복 횟수만 바로잡으세요.
5. 추가 실험
필수 수정을 확인한 뒤 별도 사본에서 count의 초깃값을 2로 바꾸고, 고정 횟수 반복의
최종값을 먼저 계산해 보세요. 같은 초깃값에서 while (count < 4)를 쓰면 전이가 몇 번
일어나는지도 비교해 보세요. 앞의 것은 작업량을, 뒤의 것은 목표 상태를 보장합니다. 명세에
맞는 반복을 고르는 연습이며, 채점하기 전에는 starter 구조로 되돌리세요.