2014-10-21 4 views
1

아래의 기능과 동일한 CFG를 만들려고합니다. 나는 B가 루프 카운터이므로 스택에 푸시 된 일련의 요소 일 수 있으므로 루프가 완료 될 때마다 B의 요소가 팝되고 B가 엡실론을 종료합니다. while 루프의 상단 부분에서 어떻게 추가를 처리합니까?CFG를 사용하여 곱하기

PROCEDURE multiply a, b; 
VAR a, b, z; 
BEGIN 
z := 0; 
    WHILE b > 0 DO BEGIN 
     z := a + z; 
     b := b - 1; 
    END 
    RETURN z; 
END; 

답변

0

CSG로 확실히 할 수는 있지만 CFG로는 불가능합니다. 펌핑 보조 정리는 불가능을 증명하기에 충분해야합니다. b이 고정

경우, 그러나, 그것은 쉽게 :

유일한 의미는 내가하는 CFG 구현할 수있는 생각할 수있는 형태

 
0a1a·b 

의 문자열을 인식

 
S ⇒ ε 
S ⇒ 0 S 1 1 … 1 
     (b times) 

곱셈.

+0

오, 그래서 보존해야 할 스택 프레임이 없거나 PDA 같은 것이 있습니까? – CodeMonkey

+0

@CodeMonkey : PDA의 스택은 꽤 제한되어 있습니다. 당신은 오직 상단에 접근 할 수 있습니다. 일단 당신이 그것을 팝업, 그것은 사라 졌어요. 따라서 스택 프레임 개념은 이러한 맥락에서 이해가되지 않습니다. – rici