ârââ¥sâ§âtââŠâ¥ âŠâ¢ ââŠââ§s ââŠââ¡ â ⣠â t â¶ â â¿ â¿ â¿ â t ⊠⮠â â mark A ââŠââ¡ â t â¶ â â³ â³ â³ ââŠââ¡ â t ⊠â call p/k ââ¿ â³ â³ â³ ââ ââ â£â§â¡â¿ â§â¡t ⣠â ⣠â ââ â³â ⣠â â â³â âš â®â® ââ¥â â â ⢠ⳠâŒâŠ â¶ â âš âŒâŠ â· â£ â± tâ€â¡â¥ ââŠââ¡ â ⣠â â¡â âts tâ€â¡ ââŠââ¡â¿ mark A putref 1 call p/3 ââ¿ â³ â³ â³ putatom a putvar 2 putvar 1 putstruct g/2
ârââ¥sâ§âtââŠâ¥ âŠâ¢ ââŠââ§s âtrââtârâ¡ âŠâ¢ â â¢rââ â¡â¿ âP â§âŠâââ§ stââ⊠ârâ£ââ â¡â¥ts âP PâŠsââŠâ¥t âµ âPâŠâ§â â²â¶ â²â· âŠrâ£ââ¥ââ¢âtââŠâ¥ââ§ ââ¡â§â§s â²âž â²â¹ â²âº
ârââ¥sâ§âtââŠâ¥ âŠâ¢ ââŠââ§s ââ¡â ârâŠsâ¿ ââ€â¡ â£âŠsâtâââ¡ ââŠâ¥tââ¥ââtââŠâ¥ ââârâ¡ss PosCont râ¡ââŠrâs ââ€â¡râ¡ t⊠ââŠâ¥tââ¥ââ¡ ââ¢tâ¡r sââââ¡ssâ¢ââ§ trâ¡âtâ â¡â¥t âŠâ¢ tâ€â¡ â£âŠââ§â³ ââââtââŠâ¥ââ§ âŠrâ£ââ¥ââ¢âtââŠâ¥ââ§ ââ¡â§â§s ârâ¡ â¥â¡ââ¡ssârâ¡ â¢âŠr ââââŠtrâââŠââ¥â£ â³
ârââ¥sâ§âtââŠâ¥ âŠâ¢ ââŠââ§s â â» â âr⊠â âP âP SP = SP + 6; S[SP] = A; S[SP-1] = FP;
ârââ¥sâ§âtââŠâ¥ âŠâ¢ ââŠââ§s Pâ â£âŽâ¥ âââ§â§ â£âŽâ¥ ⥠âP FP = SP - n; PC = p/n;
â¯â¥ââââtââŠâ¥ â²â¡ ââ¡â¥âŠtâ¡ âŠââârrâ¡â¥ââ¡s âŠâ¢ â âârââââ§â¡ â³ â⡠⊠ⳠⳠâ t âââ§â§ ââ¡ trââ¥sâ§âtâ¡â ââââ¡râ¡â¥tâ§â¡ ââ¡â£â¡â¥âââ¥â£ ââ€â¡tâ€â¡r âtâ¬s ââ¥âtâââ§ââ¢â¡â âŠr â¥âŠtâ³ â²â¡ ââ¥trâŠââââ¡ tâ€â¡ â ââr⊠â£ât ⊠Ⳡâ â¿ â£ât â³ â â putvar â ââ³ â® â£ât â â³ â â putref â ââ³ â® â£ât â â putanon
â¯â¥ââââtââŠâ¥ ârââ¥sâ§âtââŠâ¥ âŠâ¢ tâ€â¡ ââ¥ââââtââŠâ¥ ⊠Ⳡâ t â¿ â£âs†â râ¡â¢â¡râ¡â¥ââ¡ t⊠ⳠâŠâ¥t⊠tâ€â¡ stâââŠâ ââŠâ¥strâât tâ€â¡ tâ¡râ t â⥠tâ€â¡ â€â¡ââ£â ââ¥trâŠââââ¡ â â¥â¡â ââ¥strââtââŠâ¥ ââ€ââ†ââ â£â§â¡â â¡â¥ts tâ€â¡ ââ¥ââââtââŠâ¥â³ ââŠââ¡ â â ⊠â£ât ⊠Ⳡâ t â® â â â³ â ââŠââ¡ â t â unify
â¯â¥ââââtââŠâ¥ ââ ââ â£â§â¡â¿ ââŠâ¥sâââ¡r tâ€â¡ â¡qââtââŠâ¥ ⯠â ⢠â ⣠â â â â³â âš â® â ââ â© â® ââ€â¡â¥â± â£âââ¡â¥ â⥠ââârâ¡ss â¡â¥âârâŠâ¥â â¡â¥t â â ⢠ⳠâŒâŠ â¶ â âš âŒâŠ â· â â© âŒâŠ âž â ⯠âŒâŠ â¹ â£ tâ€â¡ â¢âŠâ§â§âŠâââ¥â£ ââŠââ¡ âs â£â¡â¥â¡râtâ¡ââ¿ putref 4 putatom a putref 1 putvar 3 putvar 2 putstruct f/3 putstruct g/2 unify
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ unify ââ£â£â§ââ¡s tâ€â¡ rââ¥â²tââ â¡ â¢ââ¥âtââŠâ¥ unify() t⊠tâ€â¡ tâŠâ£â âŠst tâ⊠râ¡â¢â¡râ¡â¥ââ¡sâ¿ ââ¥ââ¢â¡ unify (S[SP-1], S[SP-2]); SP = SP - 2;
â¯â¥ââââtââŠâ¥ âââ¥âtââŠâ¥ unify() â³ â³ â³ tââŠâ¡s tâ⊠â€â¡â⣠ââârâ¡ssâ¡sâ³ ââŠr â¡ââ†âââ§â§ ââ¡ â£âârââ¥tâ¡â¡ tâ€ât tâ€â¡sâ¡ ârâ¡ â ââ ââ ââ§â§â¡ ââ¡râ¡â¢â¡râ¡â¥ââ¡â â³ â³ â³ â³ ââ€â¡ââŠs ââ€â¡tâ€â¡r tâ€â¡ tâ⊠ââârâ¡ssâ¡s ârâ¡ ââ§râ¡âââ¡ âââ¡â¥tââââ§ â³ â ⥠tâ€ât ââsâ¡ ââŠâ¡s â¥âŠtâ€ââ¥â£ ââ¥â tâ€â¡ ââ¥ââââtââŠâ¥ sââââ¡â¡ââ¡ââ³ â³ â³ â³ âââ¥âs â¡âŠââ¥â£â¡r âârââââ§â¡s ââ§ârâ£â¡r ââârâ¡ssâ¡sâ® t⊠âŠâ§ââ¡r âârââââ§â¡s âsâ ââ§â§â¡r ââârâ¡ssâ¡sâ®â³ â³ â³ â³ ââ€â¡â¥ âââ¥âââ¥â£ â âârââââ§â¡ t⊠â tâ¡râ â± ââ€â¡ââŠs ââ€â¡tâ€â¡r tâ€â¡ âârââââ§â¡ âŠââârs ââ¥sâââ¡ tâ€â¡ tâ¡râ â âŠââârâ²ââ€â¡â⊠â®â³ â³ â³ â³ râ¡ââŠrâs â¥â¡ââ§â¡ ârâ¡âtâ¡â âââ¥âââ¥â£sâ³ â³ â³ â³ â ââ¡ â¢âââ§â± â⥠ââ€ââ†ââsâ¡ ââ¥âtââtâ¡s ââââŠtrâââŠââ¥â£ â³
â¯â¥ââââtââŠâ¥ bool unify (ref u, ref v) { if (u == v) return true; if (H[u] == (R, )) { if (H[v] == (R, )) { if (u > v) { H[u] = (R,v); trail(u); return true; } else { H[v] = (R,u); trail(v); return true; } } else if (check (u,v)) { H[u] = (R,v); trail(u); return true; } else { backtrack(); return false; } } ...
â¯â¥ââââtââŠâ¥ ... if (H[v] == (R, )) { if (check (v,u)) { H[v] = (R,u); trail(v); return true; } else { backtrack(); return false; } } if (H[u] == (A,a) && H[v] == (A,a)) return true; if (H[u] == (S,f/n) && H[v] == (S,f/n)) { for (int i=1; i<=n; i++) if (!unify (deref(H[u+i]), deref(H[v+i]))) return false; return true; } backtrack(); return false; }
â¯â¥ââââtââŠâ¥ â â â â â¢âŽâ· â â â â â¢âŽâ·
â¯â¥ââââtââŠâ¥ â â â â â¢âŽâ· â â â â â¢âŽâ·
â¯â¥ââââtââŠâ¥ â â â â â¢âŽâ· â â â â â¢âŽâ·
â¯â¥ââââtââŠâ¥ â â â â â¢âŽâ· â â â â â¢âŽâ·
â¯â¥ââââtââŠâ¥ â â â â â¢âŽâ· â â â â â¢âŽâ·
â¯â¥ââââtââŠâ¥ ââ€â¡ â¢ââ¥âtââŠâ¥ trail() râ¡ââŠrâs â¥â¡â âââ¥âââ¥â£sâ³ ââ€â¡ â¢ââ¥âtââŠâ¥ backtrack() ââ¥âtââtâ¡s ââââŠtrâââŠââ¥â£â³ ââ€â¡ â¢ââ¥âtââŠâ¥ check() â£â¡râ¢âŠrâ s tâ€â¡ âŠââârâ²ââ€â¡ââŠâ ââ¡â³ tâ¡sts ââ€â¡tâ€â¡r â âârââââ§â¡ ââts ârst ârâ£ââ â¡â¥tâ® âŠââârs ââ¥sâââ¡ â tâ¡râ ââts sâ¡ââŠâ¥â ârâ£ââ â¡â¥tâ®â³ ââ¢tâ¡â¥â± tâ€âs ââ€â¡â⊠âs sâŠââ£â£â¡ââ¿ bool check (ref u, ref v) { return true; }
â¯â¥ââââtââŠâ¥ âtâ€â¡rââsâ¡â± ââ¡ ââŠââ§â ââ â£â§â¡â â¡â¥t check() âs â¢âŠâ§â§âŠâsâ¿ bool check (ref u, ref v) { if (u == v) return false; if (H[v] == (S,f/n)) for (int i=1; i<=n; i++) if (!check (u, deref (H[v+i]))) return false; return true; }
â¯â¥ââââtââŠâ¥ ââ€â¡ trââ¥sâ§âtââŠâ¥ âŠâ¢ â⥠â¡qââtââŠâ¥ ⊠Ⳡâ t âs ââ¡râ¡ sââ â£â§â¡â± âât ââ§â§ tâ€â¡ âŠââ¥â¡âts ââŠâ¥strââtâ¡â t⊠râ¡â£râ¡sâ¡â¥t t ââ€ââ†â€âââ¡ ââŠrrâ¡sâ£âŠâ¥âââ¥â£ â âtââ€ââ¥â£ âŠââ¥â¡ât râ¡âââ€âââ§â¡ â¢râŠâ â³ ââ¡ââŠâ â¡s ââ â â¡âââtâ¡â§â¡ â£ârâââ£â¡ â³ â ââ¡â⿠⣠Pâs†â râ¡â¢â¡râ¡â¥ââ¡ t⊠tâ€â¡ rââ¥â²tââ â¡ âââ¥âââ¥â£ âŠâ¢ ⊠ⳠâŠâ¥t⊠tâ€â¡ stâââŠâ³ ⣠âââŠââ ââŠâ¥strââtââŠâ¥ âŠâ¢ sââtâ¡râ s âŠâ¢ t âs â§âŠâ¥â£ âs â£âŠssâââ§â¡â³ ⣠â â¥stâ¡âââ± trââ¥sâ§âtâ¡ â¡ââ†â¥âŠââ¡ âŠâ¢ t ââ¥t⊠â⥠ââ¥strââtââŠâ¥ ââ€ââ†â£â¡râ¢âŠrâ s tâ€â¡ ââ¥ââââtââŠâ¥ âât†tâ€âs â¥âŠââ¡âŠ ââŠââ¡ â â ⊠â£ât ⊠Ⳡâ t â® â â â³ â ââŠâ⡠⯠t â
â¯â¥ââââtââŠâ¥ â¯â¥ââââtââŠâ¥ âŠâ¢ âtâŠâ s ââ¥â âârââââ§â¡sâ¿ ââŠâ⡠⯠â â â uatom a ââŠâ⡠⯠Ⳡâ â uvar â ââ³ â® ââŠâ⡠⯠â â³ â â uref â ââ³ â® ââŠâ⡠⯠â â pop
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ uatom a ââ â£â§â¡â â¡â¥ts tâ€â¡ ââ¥ââââtââŠâ¥ âât†â⥠âtâŠâ â¿ â â â â ââtâŠâ â v = S[SP]; SP--; switch (H[v]) { case (A,a): break; case (R, ): H[v] = (R, new(A,a)); trail(v); break; default: backtrack(); }
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ uvar i ââ â£â§â¡â â¡â¥ts tâ€â¡ ââ¥ââââtââŠâ¥ âât†â⥠ââ¥ââ¥âtâââ§ââ¢â¡â âârââââ§â¡â¿ â â âP âP âââr â S[FP+i] = S[SP]; SP--;
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ pop ââ â£â§â¡â â¡â¥ts tâ€â¡ ââ¥ââââtââŠâ¥ âât†â⥠ââ¥âŠâ¥â¡â âŠâs âârââââ§â¡â¿ â£âŠâ£ SP--;
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ uref i ââ â£â§â¡â â¡â¥ts tâ€â¡ ââ¥ââââtââŠâ¥ âât†â⥠ââ¥âtâââ§ââ¢â¡â âârââââ§â¡â¿ â³ âš â â â âP âP â â â â£ââ â³â âš â® ârâ¡â¢ â unify (S[SP], deref(S[FP+i])); SP--; ââ€â¡ âŠâ¥â§â¡ â£â§âââ¡â± ââ€â¡râ¡ tâ€â¡ rââ¥â²tââ â¡ â¢ââ¥âtââŠâ¥ unify() âs âââ§â§â¡ââŠ
â¯â¥ââââtââŠâ¥ â¯â¥ââââtââŠâ¥ âŠâ¢ ââŠâ¥strââtâŠr ââ£â£â§âââtââŠâ¥sâ¿ ââ€â¡ ââ¥ââââtââŠâ¥ ââŠââ¡ â£â¡râ¢âŠrâ s â â£râ¡â²âŠrââ¡r trâââ¡rsââ§ âŠââ¡r t â³ âârst ât ââ€â¡ââŠs ââ€â¡tâ€â¡r tâ€â¡ râŠâŠt â¥âŠââ¡ âs ââ¥âââââ§â¡â³ â ⢠ââŠt†tâ¡râ s â€âââ¡ tâ€â¡ sââ â¡ tâŠâ£â âŠst ââŠâ¥strââtâŠrâ± tâ€â¡â¥ râ¡âârsâââ¡â§â¡ ââ€â¡ââŠs â¢âŠr sââtâ¡râ sâ³ â ⥠tâ€â¡ ââsâ¡ âŠâ¢ â⥠ââ¥ââ¥âtâââ§ââ¢â¡â âârââââ§â¡ sââtââ€â¡s â¢râŠâ ââ€â¡ââŠââ¥â£ t⊠ââââ§âââ¥â£â³
â¯â¥ââââtââŠâ¥ â¯â¥ââââtââŠâ¥ âŠâ¢ ââŠâ¥strââtâŠr ââ£â£â§âââtââŠâ¥sâ¿ ââŠâ⡠⯠â ⢠â t â¶ â â¿ â¿ â¿ â t ⥠â®â® â â ustruct f/n A up B ââ¿ ââ€â¡â⊠ââârsâ ⢠â t â¶ â â¿ â¿ â¿ â t ⥠â®â® â son 1 ââŠâ⡠⯠t â¶ â ââŠââ¡ â â ⢠â t â¶ â â¿ â¿ â¿ â t ⥠â®â® â â³ â³ â³ bind son n ââ¿ â³ â³ â³ ââŠâ⡠⯠t ⥠â
â¯â¥ââââtââŠâ¥ â â¢âŽâ¥ â â¢âŽâ¥ âstrâât â¢âŽâ¥ â â â âstrâât â¢âŽâ¥ â Pâ â switch (H[S[SP]]) { case (S,f/n): break; case (R, ): PC = A; break; default: backtrack(); }
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ son i â£âsâ€â¡s tâ€â¡ râ¡â¢â¡râ¡â¥ââ¡ âŠâ¢ tâ€â¡ â â²t†sââtâ¡râ âŠâ¥t⊠tâ€â¡ stâââŠâ¿ â â â¢âŽâ¥ â¢âŽâ¥ â â sâŠâ¥ â S[SP+1] = deref (H[S[SP]]+i); SP++;
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ up A â£âŠâ£s â râ¡â¢â¡râ¡â¥ââ¡ â¢râŠâ tâ€â¡ stââ⊠ââ¥â â¥ââ â£s t⊠tâ€â¡ ââŠâ¥tââ¥ââtââŠâ¥ ââârâ¡ssâ¿ â⣠â Pâ â SP--; PC = A;
â¯â¥ââââtââŠâ¥ â ⥠tâ€â¡ ââsâ¡ âŠâ¢ â⥠ââ¥ââ¥âtâââ§ââ¢â¡â âârââââ§â¡ ââ¡ â¥â¡â¡â t⊠sââtâ†â¢râŠâ ââ€â¡ââŠââ¥â£ t⊠ââââ§âââ¥â£â³ ââ¡â¢âŠrâ¡ ââŠâ¥strââtââ¥â£ tâ€â¡ â¥â¡â tâ¡râ ââ¡ â¥â¡â¡â t⊠â¡â ââ§âââ¡ tâ€ât ât ââŠâ¥tâââ¥s tâ€â¡ âârââââ§â¡ âŠâ¥ tâŠâ£ âŠâ¢ tâ€â¡ stâââŠâ¿ ⣠tâ€â¡ â¢ââ¥âtââŠâ¥ ââârsâ t â® râ¡târâ¥s tâ€â¡ sâ¡t âŠâ¢ ââ¥âtâââ§ââ¢â¡â âârââââ§â¡s âŠâ¢ t â ⣠tâ€â¡ â ââr⊠ââ€â¡â⊠⢠⚠ⶠâ â¿ â¿ â¿ â âš â ⣠â â£â¡â¥â¡râtâ¡s tâ€â¡ â¥â¡ââ¡ssârâ¡ tâ¡stsâ¿ ââ€â¡â⊠⢠⚠ⶠâ â¿ â¿ â¿ â âš â ⣠â â check â â âš â¶ â® â³ â³ â³ check â â âš â â®
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ check i tâ¡sts ââ€â¡tâ€â¡r tâ€â¡ âââ¥ââ¥âtâââ§ââ¢â¡ââ® âârââââ§â¡ âŠâ¥ tâŠâ£ âŠâ¢ tâ€â¡ stââ⊠âŠââârs ââ¥sâââ¡ tâ€â¡ tâ¡râ ââŠââ¥â t⊠tâ€â¡ â â²t†âârââââ§â¡â¿ â â â â âP âP ââ€â¡â⊠â if (!check (S[SP], deref(S[FP+i]))) backtrack();
â¯â¥ââââtââŠâ¥ â â¥strââtââŠâ¥ bind âââ¥âs tâ€â¡ âââ¥ââ¥âtâââ§ââ¢â¡ââ® âârââââ§â¡ t⊠tâ€â¡ ââŠâ¥strââtâ¡â tâ¡râ â¿ â â âââ¥â H[S[SP-1]] = (R, S[SP]); trail (S[SP-1]); SP = SP - 2;
â¯â¥ââââtââŠâ¥ ââ ââ â£â§â¡â¿ â²â¡t t â ⢠â ⣠â â â³â âš â® â ââ â© â® âât†â¡â¥âârâŠâ¥â â¡â¥t â â ⢠ⳠâŒâŠ â¶ â âš âŒâŠ â· â â© âŒâŠ âž â£ â³ ââ€â¡â¥ ââŠâ⡠⯠t â â£â¡â¥â¡râtâ¡s tâ€â¡ ââŠââ¡â¿ â â¶ â¿ check 1 ustruct f/3 A â¶ putref 1 son 1 putvar 2 putref 1 ustruct g/2 A â· putstruct g/2 putvar 2 son 1 bind putstruct g/2 â â· â¿ son 2 uref 1 putatom a son 2 uatom a putvar 3 uvar 2 son 3 putstruct f/3 up B â· uvar 3 bind â â· â¿ check 1 â â¶ â¿ â³ â³ â³ up B â¶
ââ§ââsâ¡s ââ€â¡ ââŠââ¡ â¢âŠr ââ§ââsâ¡s âââ§â§â¿ ââ§â§âŠââtâ¡ stââ⊠sâ£âââ¡ â¢âŠr â§âŠâââ§sâ â¡âââ§ââtâ¡ tâ€â¡ ââŠââ¡â â¢râ¡â¡ tâ€â¡ stââ⊠â¢rââ â¡ ââ⢠â£âŠssâââ§â¡â®â³ â²â¡ ââ¡â¥âŠtâ¡ â§âŠâââ§ âârââââ§â¡s â⡠⢠Ⳡⶠâ â¿ â¿ â¿ â â³ â ⣠Ⱡââ€â¡râ¡ tâ€â¡ ârst ⊠âŠâ¥â¡s ârâ¡ â¢âŠrâ ââ§ â£ârââ â¡tâ¡rsâ³ ââŠââ¡ â â ⣠â â³ â¶ â â¿ â¿ â¿ â Ⳡ⊠⮠⥠⣠ⶠâ â¿ â¿ â¿ â ⣠⥠⮠â pushenv m ââŠââ¡ â ⣠ⶠâ â³ â³ â³ ââŠââ¡ â ⣠⥠â popenv
ââ§ââsâ¡s â â¥strââtââŠâ¥ pushenv m ââ§â§âŠââtâ¡s stââ⊠sâ£âââ¡ â¢âŠr â§âŠâââ§ âârââââ§â¡sâ¿ â âP âP â£âsâ€â¡â¥â â SP = FP + m;
ââ§ââsâ¡s ââ ââ â£â§â¡â¿ â²â¡t r â a â â³â ⚠⮠⥠f â â â³â â³ â¶ â® â a â â â³ â¶ â â âš â® ââ€â¡â¥ ââŠââ¡ â r â£â¡â¥â¡râtâ¡s tâ€â¡ ââŠââ¡â¿ pushenv 3 call f/2 putref 2 ââ¿ mark B mark A call a/2 putref 1 putref 3 ââ¿ popenv putvar 3
Prâ¡ââââtâ¡s â â£râ¡ââââtâ¡ q/k âs ââ¡ââ¥â¡â ââ¡ â sâ¡qââ¡â¥ââ¡ âŠâ¢ ââ§ââsâ¡s rr â r â¶ â¿ â¿ â¿ r ⢠Ⳡââ€â¡ trââ¥sâ§âtââŠâ¥ âŠâ¢ â£râ¡ââââtâ¡s âs â£â¡râ¢âŠrâ â¡â ââ¡ tâ€â¡ â¢ââ¥âtââŠâ¥ ââŠââ¡ P â³ â ⢠â â£râ¡ââââtâ¡ â€âs â¥âst â sââ¥â£â§â¡ ââ§ââsâ¡ âââ¡â³ ⢠â â¶â®â± ââ¡ â€âââ¡â¿ ââŠââ¡ P r â ââŠââ¡ â r â ⢠â â£râ¡ââââtâ¡ â€âs sâ¡ââ¡rââ§ ââ§ââsâ¡sâ± tâ€â¡â¥â¿ ⣠ââ¡ ârst â§trâ¡â§ tâ€â¡ ârst ââ§ââsâ¡â ⣠â⢠ât â¢âââ§sâ± tâ€â¡â¥ â§trâ¡â§ tâ€â¡ sâ¡ââŠâ¥â âŠâ¥â¡â â¡tââ³
Prâ¡ââââtâ¡s â ⢠ââ¥ââââtââŠâ¥ â¢âââ§sâ± ââ¡ âââ§â§ tâ€â¡ rââ¥â²tââ â¡ â¢ââ¥âtââŠâ¥ backtrack() â³ ââ€â¡ â£âŠââ§ âs t⊠râŠâ§â§ âââ⊠tâ€â¡ ââ€âŠâ§â¡ ââŠâ â£âtâtââŠâ¥ t⊠tâ€â¡ ââââŠtrââ⊠â£âŠââ¥t â ââ¡â³ t⊠tâ€â¡ âââ¡â¥ââ ââââ§â§â¡â® â§âtâ¡st â£âŠââ§ ââ€â¡râ¡ tâ€â¡râ¡ âs ââ¥âŠtâ€â¡r ââ§ââsâ¡ t⊠â§trâ¡â§â³ â ⥠âŠrââ¡r t⊠râ¡stâŠrâ¡ â£râ¡âââŠâsâ§â¡ âââ§ââ âââ¥âââ¥â£sâ± ââ¡ â€âââ¡ âsâ¡â tâ€â¡ rââ¥â²tââ â¡ â¢ââ¥âtââŠâ¥ trail() ââ€ââ†stâŠrâ¡s â¥â¡â âââ¥âââ¥â£s â⥠â sâ£â¡ââââ§ â â¡â âŠrâ¡ ârâ¡ââ³
Prâ¡ââââtâ¡s ârâââ§â¿ â âµ â¶ âP â â ârââ⧠†â â¡â âŠrâ¡ ârâ¡â â¢âŠr stâŠrââ¥â£ â¥â¡â âââ¥âââ¥â£sâ âP â ââââ§â²PâŠââ¥tâ¡r †â£âŠââ¥ts t⊠tâ€â¡ tâŠâ£â âŠst âsâ¡â ââ¡â§â§â³
Prâ¡ââââtâ¡s ââ€â¡râ¡ âs ââ§s⊠â sâ£â¡ââââ§ râ¡â£âstâ¡r âP ââ€ââ†â£âŠââ¥ts t⊠tâ€â¡ âârrâ¡â¥t ââââŠtrââ⊠â£âŠââ¥tâ³ â âµ â¶ âP âP âP
Prâ¡ââââtâ¡s â ââââŠtrââ⊠â£âŠââ¥t âs â stââ⊠â¢rââ â¡ t⊠ââ€ââ†â£râŠâ£rââ â¡â â¡ââtââŠâ¥ â£âŠssâââ§â¡ râ¡târâ¥sâ¿ âP PâŠsââŠâ¥t âµ âPâŠâ§â â²â¶ âPâŠâ§â â²â· âPâŠâ§â â²âž âPâŠâ§â â²â¹ ââ¡â£ââŠâ¥t â²âº â²â¡ âââ§â§ âsâ¡ â¢âŠâ§â§âŠâââ¥â£ â âârâŠs t⊠ââ¡â¥âŠtâ¡ âŠrâ£ââ¥ââ¢âtââŠâ¥ââ§ ââ¡â§â§sâ¿ â â S[FP ᅵ âž ] PosCont S[FP] TPold FPold â S[FP ᅵ â¶ ] BPold â S[FP ᅵ â¹ ] â S[FP ᅵ â· ] â S[FP ᅵ ⺠] HPold NegCont
Prâ¡ââââtâ¡s ââ€â¡ rââ¥â²tââ â¡ â¢ââ¥âtââŠâ¥ backtrack() râ¡stâŠrâ¡s râ¡â£âstâ¡rs ââââŠrâââ¥â£ t⊠tâ€â¡ â¢rââ â¡ ââŠrrâ¡sâ£âŠâ¥âââ¥â£ t⊠ââââŠtrââ⊠â£âŠââ¥tâ¿ void backtrack() { FP = BP; HP = HPold; reset (TPold,TP); TP = TPold; PC = NegCont; } ââ€â¡ â¢ââ¥âtââŠâ¥ reset() râ¡stâŠrâ¡s âârââââ§â¡ âââ¥âââ¥â£sâ ââ¡â³ ââ¥ââŠâ¡s ââ§â§ âââ¥âââ¥â£s ârâ¡âtâ¡â ââ¢tâ¡r tâ€â¡ ââââŠtrââ⊠â£âŠââ¥tâ³
Prâ¡ââââtâ¡s âP âP ââââŠtrâââŠââ® âP âP â¹â· â¹â· â¹â· âP âP â¶âŒ â¶âŒ â¶âŒ âP âP Pâ Pâ â¶âž â¶âž â¶âž
Prâ¡ââââtâ¡s ââ€â¡ âârââââ§â¡s ââ€ââ†ârâ¡ ârâ¡âtâ¡â sââ¥ââ¡ tâ€â¡ â§âst ââââŠtrââ⊠â£âŠââ¥t ââ⥠ââ¡ râ¡â âŠââ¡â tâŠâ£â¡tâ€â¡r âât†tâ€â¡âr âââ¥âââ¥â£s sââ â£â§â¡ ââ¡ râ¡stâŠrââ¥â£ tâ€â¡ âŠâ§â âââ§ââ¡ âŠâ¢ tâ€â¡ râ¡â£âstâ¡r âPâ³ ââ€âs ââŠrâŠs ââ¥â¡ â⢠â¡âŠââ¥â£â¡r âârââââ§â¡s ââ§âââ¡s â£âŠââ¥t t⊠âŠâ§ââ¡r âŠââ¥â¡âtsâ³ âââ¥âââ¥â£s ââ€â¡râ¡ âŠâ§ââ¡r âârââââ§â¡s â£âŠââ¥t t⊠â¡âŠââ¥â£â¡r âŠââ¥â¡âts â âst ââ¡ râ¡sâ¡t â§â ââ¥âââ§â§â¡â§â³ ââ€â¡sâ¡ âââ¥âââ¥â£s ârâ¡ râ¡ââŠrââ¡â â⥠tâ€â¡ trâââ§ â³
Prâ¡ââââtâ¡s ââ€â¡ â¢ââ¥âtââŠâ¥ trail() râ¡ââŠrâs â âââ¥âââ¥â£ â⢠tâ€â¡ ârâ£ââ â¡â¥t â£âŠââ¥ts t⊠â â¡âŠââ¥â£â¡r âŠââ¥â¡âtâ¿ void trail (ref u) { if (u < S[BP-2]) { TP = TP+1; T[TP] = u; } } ââ€â¡ ââ¡â§â§ S[BP-2] ââŠâ¥tâââ¥s tâ€â¡ âââ§ââ¡ âŠâ¢ âP ââ¡â¢âŠrâ¡ tâ€â¡ ârâ¡âtââŠâ¥ âŠâ¢ ââââŠtrââ⊠â£âŠââ¥tâ³ ââ€â¡ â¢ââ¥âtââŠâ¥ reset() râ¡â âŠââ¡s ââ§â§ âââ¥âââ¥â£s ârâ¡âtâ¡â ââ¢tâ¡r tâ€â¡ â§âst ââââŠtrââ⊠â£âŠââ¥tâ¿ void reset (ref x, ref y) { for (ref u=y; x<u; u--) H[T[u]] = (R,T[u]); }
Prâ¡ââââtâ¡s ârââ¥sâ§âtââŠâ¥ âŠâ¢ â â£râ¡ââââtâ¡ q/k â± ââ€ââ†âs ââ¡ââ¥â¡â ââ¡ ââ§ââsâ¡s r â¶ â â¿ â¿ â¿ â r ⢠â ⢠â â¶â®â± â£â¡â¥â¡râtâ¡s â ââŠââ¡ ââ€âââ€â¿ ârâ¡âtâ¡s â ââââŠtrââ⊠â£âŠââ¥tâ sââââ¡ssâââ¡â§â¡ â§trââ¡sâ§ tâ€â¡ ââ§tâ¡râ¥âtâââ¡sâ ââ¡â§â¡tâ¡s tâ€â¡ ââââŠtrââ⊠â£âŠââ¥tâ³
Prâ¡ââââtâ¡s ââŠââ¡ P â r â¶ â â¿ â¿ â¿ â r ⢠⮠â qâŽâŠâ¿ setbtp jump A ⢠â â¶ â¿ ââŠââ¡ â r â¶ try A â¶ â³ â³ â³ â³ â³ â³ try A ⢠ᅵ â¶ â ⢠⿠ââŠââ¡ â r ⢠delbtp ââ⊠ââ€â¡ ââââŠtrââ⊠â£âŠââ¥t âs ââ¡â§â¡tâ¡â ââ¡â¢âŠrâ¡ tâ€â¡ â§âst ââ§tâ¡râ¥âtâââ¡ âs â§trââ¡ââ§â³ ââŠr tâ€â¡ â§â§âst trâ¡â§â± tâ€â¡ ââŠââ¡ â¥ââ â£s âârâ¡âtâ§â¡ t⊠tâ€â¡ ââ§tâ¡râ¥âtâââ¡ ââ¥â â¥â¡ââ¡r râ¡târâ¥s t⊠tâ€â¡ â£râ¡sâ¡â¥t â¢rââ â¡â³
Prâ¡ââââtâ¡s ââ ââ â£â§â¡â¿ t â â s â Ⳡ⮠⥠Ⳡ⮠â s â Ⳡ⮠⥠Ⳡâ â ârââ¥sâ§âtââŠâ¥ âŠâ¢ tâ€â¡ â£râ¡ââââtâ¡ s â 1 râ¡sââ§tsâ¿ sâŽâ¶â¿ setbtp ââ¿ pushenv 1 ââ¿ pushenv 1 try A mark C putref 1 delbtp putref 1 uatom a jump B call t/1 popenv ââ¿ popenv
Prâ¡ââââtâ¡s â â¥strââtââŠâ¥ setbtp sâââ¡s râ¡â£âstâ¡rs âPâ± âPâ± âPâ¿ âP âP â¹â· sâ¡tât⣠â¶âŒ âP âP â¹â· â¹â· âP âP â¶âŒ â¶âŒ âP âP HPold = HP; TPold = TP; BPold = BP; BP = FP;
Prâ¡ââââtâ¡s â â¥strââtââŠâ¥ try A sâââ¡s tâ€â¡ âârrâ¡â¥t Pâ âs tâ€â¡ â¥â¡â£âtâââ¡ ââŠâ¥tââ¥ââtââŠâ¥ ââârâ¡ss ââ¥â â¥ââ â£s t⊠tâ€â¡ ââ§tâ¡râ¥âtâââ¡ t⊠ââ¡ â§trââ¡ââ§ ât ââârâ¡ss ââ¿ âP âP âP âP trâ¡ â âP âP âP âP Pâ Pâ â·âŸ â â·âŸ NegCont = PC; PC = A;
Prâ¡ââââtâ¡s â â¥strââtââŠâ¥ delbtp râ¡stâŠrâ¡s tâ€â¡ âââ§ââ¡ âŠâ¢ âPâ¿ âP âP ââ¡â§ât⣠âP âP âP âP âP âP BP = BPold;
Prâ¡ââââtâ¡s â â¥strââtââŠâ¥ popenv râ¡stâŠrâ¡s râ¡â£âstâ¡rs âP ââ¥â Pââ± ââ¥â â⢠â£âŠssâââ§â¡ â£âŠâ£s tâ€â¡ stââ⊠â¢rââ â¡â¿ âP âP â¹â· â» â£âŠâ£â¡â¥â âP âP Pâ Pâ â¹â· if (FP â BP) SP = FP - 6; PC = PosCont; FP = FPold;
Prâ¡ââââtâ¡s â ⢠âP â âP tâ€â¡ â¢rââ â¡ âs â¥âŠt ââ¡ââ§â§âŠââtâ¡ââ¿ âP âP â¹â· â¹â· â£âŠâ£â¡â¥â â» â» âP âP Pâ Pâ â¹â· if (FP â BP) SP = FP - 6; PC = PosCont; FP = FPold;
âââ¡rââ¡s ââ¥â PrâŠâ£rââ s ârââ¥sâ§âtââŠâ¥ âŠâ¢ â â£râŠâ£rââ ⣠â rr â¶ â¿ â¿ â¿ rr †â ⣠â£â¡â¥â¡râtâ¡s⿠⣠ââŠââ¡ â¢âŠr â¡âââ§ââtââ¥â£ tâ€â¡ qââ¡r⡠⣠â ⣠ââŠââ¡ â¢âŠr tâ€â¡ â£râ¡ââââtâ¡ ââ¡ââ¥âtââŠâ¥s rr â â³ âââ¡râ¡ â¡âââ§ââtââŠâ¥ âs â£râ¡ââ¡ââ¡â ââ¡â¿ ⣠ââ¥âtâââ§ââ¢âtââŠâ¥ âŠâ¢ râ¡â£âstâ¡rsâ ⣠ââ§â§âŠââtââŠâ¥ âŠâ¢ sâ£âââ¡ â¢âŠr â£â§âŠâââ§sâ³ âââ¡râ¡ â¡âââ§ââtââŠâ¥ âs sââââ¡â¡ââ¡â ââ¡â¿ ⣠râ¡târâ¥ââ¥â£ tâ€â¡ âââ§ââ¡s âŠâ¢ â£â§âŠâââ§sâ³
âââ¡rââ¡s ââ¥â PrâŠâ£rââ s ââŠââ¡ â rr â¶ â¿ â¿ â¿ rr †â ⣠⮠â ââŠââ¡ P rr â¶ init â³ â³ â³ pushenv d ââŠââ¡ â ⣠â ââŠââ¡ P rr †halt d ââ€â¡râ¡ â¢râ¡â¡ â ⣠⮠â ⢠Ⳡⶠâ â¿ â¿ â¿ â â³ â ⣠ââ¥â â â ⢠Ⳡâ âŒâŠ â ⥠â â â¶ â¿ â¿ â¿ â ⣠Ⳡâ â¥strââtââŠâ¥ halt d â³ â³ â³ â³ â³ â³ tâ¡râ ââ¥âtâ¡s tâ€â¡ â£râŠâ£rââ â¡â â¡ââtââŠâ¥â â³ â³ â³ râ¡târâ¥s tâ€â¡ âââ§ââ¡s âŠâ¢ â â£â§âŠâââ§sâ â³ â³ â³ â⢠âsâ¡r râ¡qââ¡stsâ± â£â¡râ¢âŠrâ s ââââŠtrâââŠââ¥â£â³
âââ¡rââ¡s ââ¥â PrâŠâ£rââ s â â¥strââtââŠâ¥ init ârâ¡âtâ¡s tâ€â¡ ââ¥âtâââ§ ââââŠtrââ⊠â£âŠââ¥tâ¿ âP âP â²â¶ âP âP âµ âµ âP ââ¥ât âP â²â¶ â²â¶ âµ âP âP â²â¶ â²â¶ â²â¶ BP = FP = SP = 5; S[0] = f; ⢠S[1] = S[2] = -1; S[3] = 0; BP = FP; â ⢠tâ€â¡ qââ¡r⡠⣠â¢âââ§sâ± tâ€â¡ ââŠââ¡ ât ââârâ¡ss ⢠âââ§â§ ââ¡ â¡â â¡ââtâ¡â ââ¡â£â³ â£rââ¥ts â â â¡ssââ£â¡ tâ¡â§â§ââ¥â£ âââŠât tâ€â¡ â¢âââ§ârâ¡â®â³
âââ¡rââ¡s ââ¥â PrâŠâ£rââ s ââ ââ â£â§â¡â¿ t â Ⳡ⮠⥠â q â Ⳡ⮠⥠s â â s â Ⳡ⮠⥠â â³ â â â³ â® â³ â â p ⥠q â â³ â® â t â â s â Ⳡ⮠⥠t â â â³ â® â³ â® â p init â£âŽâµâ¿ pushenv 1 qâŽâ¶â¿ pushenv 1 ââ¿ pushenv 1 pushenv 0 mark B mark D mark G mark A putvar 1 putref 1 putref 1 call p/0 call q/1 call s/1 call t/1 ââ¿ halt 0 ââ¿ mark C ââ¿ popenv ââ¿ popenv tâŽâ¶â¿ pushenv 1 sâŽâ¶â¿ setbtp ââ¿ pushenv 1 putref 1 putref 1 call t/1 try E putref 1 ââ¿ popenv uatom b delbtp uatom a popenv jump F popenv
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ ââŠâ¥sâââ¡r tâ€â¡ â£râ¡ââââtâ¡ app/3 ââ¡ââ¥â¡â âs â¢âŠâ§â§âŠâsâ¿ app â â³â âšâ ⩠⮠⥠Ⳡâ ⬠⪠â âš â â© app â â³â âšâ ⩠⮠⥠Ⳡâ ⬠â ⥠Ⳡⵠ⪠â â© â ⬠â ⥠⩠ⵠ⪠â app â â³ âµ â âšâ â© âµ â® ââ€â¡ â§âst â£âŠââ§ âŠâ¢ tâ€â¡ sâ¡ââŠâ¥â ââ§ââsâ¡ âs â râ¡âârsâââ¡ âââ§â§â¿ ââ¡ ââ⥠â¡âââ§ââtâ¡ ât â⥠tâ€â¡ âârrâ¡â¥t stââ⊠â¢rââ â¡â ââ¢tâ¡r âsââââ¡ssâ¢ââ§â® ââŠâ â£â§â¡tââŠâ¥â± ââ¡ âââ§â§ â¥âŠt râ¡târ⥠t⊠tâ€â¡ âârrâ¡â¥t â¢rââ â¡ âât â£âŠ âârâ¡âtâ§â¡ âââ⊠t⊠tâ€â¡ â§â£râ¡ââ¡ââ¡ssâŠrâ§ â¢rââ â¡â³
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ ââŠâ¥sâââ¡r â ââ§ââsâ¡ r â p â â³ â¶ â â¿ â¿ â¿ â Ⳡ⊠⮠⥠⣠ⶠâ â¿ â¿ â¿ â ⣠⥠Ⱡââ€ââ†â€âs â â§âŠâââ§ âârââââ§â¡s ââ¥â ââ€â¡r⡠⣠⥠â q â t â¶ â â¿ â¿ â¿ â t †â®â³ ââŠââ¡ â r â pushenv m ââŠââ¡ â t â¶ â ââŠââ¡ â ⣠ⶠâ â³ â³ â³ â³ â³ â³ ââŠââ¡ â t †â ââŠââ¡ â ⣠⥠ᅵ â¶ â call q/h ââ¿ popenv mark B
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ ââŠâ¥sâââ¡r â ââ§ââsâ¡ r â p â â³ â¶ â â¿ â¿ â¿ â Ⳡ⊠⮠⥠⣠ⶠâ â¿ â¿ â¿ â ⣠⥠Ⱡââ€ââ†â€âs â â§âŠâââ§ âârââââ§â¡s ââ¥â ââ€â¡r⡠⣠⥠â q â t â¶ â â¿ â¿ â¿ â t †â®â³ ââŠââ¡ â r â pushenv m ââŠââ¡ â t â¶ â ââŠââ¡ â ⣠ⶠâ â³ â³ â³ â³ â³ â³ ââŠââ¡ â t †â ââŠââ¡ â ⣠⥠ᅵ â¶ â lastcall (q/h,m) lastmark
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ â ⢠tâ€â¡ âârrâ¡â¥t ââ§ââsâ¡ âs â¥âŠt â§âst âŠr â£âŠââ§s ⣠ⶠâ â¿ â¿ â¿ â ⣠⥠ᅵ â¶ â€âââ¡ ârâ¡âtâ¡â ââââŠtrââ⊠â£âŠââ¥tsâ± tâ€â¡â¥ âP â âPâ³ ââ€â¡â¥ tâ€â¡ ââ¥strââtââŠâ¥ lastmark ârâ¡âtâ¡s â â¥â¡â â¢rââ â¡ âât stâŠrâ¡s â râ¡â¢â¡râ¡â¥ââ¡ t⊠tâ€â¡ â£râ¡ââ¡ââ¡ssâŠr â¢rââ â¡â³ âtâ€â¡rââsâ¡ âââ¡â³ â⢠âP â âPâ®â± ât ââŠâ¡s â¥âŠtâ€ââ¥â£â³
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ â â» âP âP â§âstâ âr⊠âP âP â â if (FP â BP) { SP = SP + 6; S[SP] = PosCont; S[SP-1] = FPold; }
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ â ⢠âP â âPâ± tâ€â¡â¥ tâ€â¡ ââ¥strââtââŠâ¥ lastcall (q/h,m) ââ¡â€âââ¡s â§ââŠâ¡ call q/h â³ âtâ€â¡rââsâ¡â± tâ€â¡ âârrâ¡â¥t stââ⊠â¢rââ â¡ âs râ¡âsâ¡â⿠⣠tâ€â¡ ââ¡â§â§s S[FP+1] â± â³ â³ â³ â± S[FP+h] â£â¡t â¥â¡â âââ§ââ¡sâ ⣠ââ¥â tâ€â¡â¥ âârâ¡âtâ§â¡ â¥ââ â£s t⊠tâ€â¡ â£râ¡ââââtâ¡ q/h â³ lastcall (q/h,m) â if (FP â BP) call q/h; else { move (m,h); jump q/h; }
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ †â â§âstâââ§â§âqâŽâ€â±â â® âP âP âP âP qâŽâ€ Pâ
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ ââŠâ¥sâââ¡r tâ€â¡ ââ§ââsâ¡ a â â³â ⚠⮠⥠f â â â³â â³ â¶ â® â a â â â³ â¶ â â âš â® ââ€â¡ â§âst âââ§â§ âŠâ£tââ ââ¢âtââŠâ¥ â¡ââ¡â§âsâ¿ pushenv 3 putvar 3 putref 3 mark A call f/2 putref 2 putref 1 ââ¿ lastmark lastcall(a/2,3) ââ⊠â ⢠tâ€â¡ ââ§ââsâ¡ âs â§âst ââ¥â âts â§âst â£âŠââ§ âs tâ€â¡ âŠâ¥â§â¡ âŠâ¥â¡â± tâ€â¡â¥ ââ¡ ââ⥠âŠâ ât lastmark ââ¥â râ¡â£â§âââ¡ lastcall(q/h,m) âât†ââ¥strââtââŠâ¥s move(m,h) ââ¥â jump q/h â³
â²âst âââ§â§ ââ£tââ ââ¢âtââŠâ¥ ââ€â¡ â§âst âââ§â§ âŠâ£tââ ââ¢âtââŠâ¥ â¢âŠr tâ€â¡ sâ¡ââŠâ¥â ââ§ââsâ¡ âŠâ¢ app/3 â¡ââ¡â§âsâ¿ ââ¿ pushenv 6 putstruct [|]/2 ââ¿ check 4 putref 1 bind putref 4 ustruct [|]/2 B ââ¿ putref 3 putvar 6 son 1 ustruct [|]/2 D putstruct [|]/2 uvar 4 son 1 bind ââ¿ putref 5 son 2 uref 4 uvar 5 son 2 putref 2 up C uvar 6 putref 6 ââ¿ putvar 4 up E move(6,3) putvar 5 jump app/3
âtââ⊠ârââ â¡ ârââ â ââ¥â£ ârââ¡r â§âŠâââ§ âârââââ§â¡s ââââŠrâââ¥â£ t⊠tâ€â¡âr â§ââ¢â¡ tââ â¡ â³ â ⢠â£âŠssâââ§â¡â± râ¡â âŠââ¡ ââ¡ââ âârââââ§â¡sâ³ ââ ââ â£â§â¡â¿ a â â³â ⩠⮠⥠p â¶ â â â³â â³ â¶ â® â p â· â â â³ â¶ â â³ â· â® â p âž â â â³ â· â â³ âž â® â p â¹ â â â³ âž â ⩠⮠⣠ââ¢tâ¡r tâ€â¡ â£âŠââ§ p â· â â â³ â¶ â â³ â· â® tâ€â¡ âârââââ§â¡ â³ â¶ âs ââ¡âââ ⣠ââ¢tâ¡r tâ€â¡ â£âŠââ§ p âž â â â³ â· â â³ âž â® tâ€â¡ âârââââ§â¡ â³ â· âs ââ¡âââ³
âtââ⊠ârââ â¡ ârââ â ââ¥â£ ââ¢tâ¡r â¡ââ¡râ¡ â¥âŠâ¥â²â§âst â£âŠââ§ ââ€ââ†â€âs ââ¡ââ âârââââ§â¡s ââ¥sâ¡rt â⥠ââ¥strââtââŠâ¥ trim â¿ â trââ â âP âP if (FP â BP) SP = FP + m; ââ⊠â²â¡ ââ⥠râ¡â âŠââ¡ ââ¡ââ â§âŠâââ§s âŠâ¥â§â¡ â⢠tâ€â¡râ¡ ârâ¡ â¥âŠ â¥â¡â ââââŠtrââ⊠â£âŠââ¥ts ârâ¡âtâ¡ââ³
âtââ⊠ârââ â¡ ârââ â ââ¥â£ ââ ââ â£â§â¡â¿ a â â³â ⩠⮠⥠p â¶ â â â³â â³ â¶ â® â p â· â â â³ â¶ â â³ â· â® â p âž â â â³ â· â â³ âž â® â p â¹ â â â³ âž â â© â® ârââ¡rââ¥â£ âŠâ¢ tâ€â¡ âârââââ§â¡sâ¿ â â ⢠ⳠâŒâŠ â¶ â â© âŒâŠ â· â â³ âž âŒâŠ âž â â³ â· âŒâŠ â¹ â â³ â¶ âŒâŠ âº â£ pushenv 5 putvar 4 ââ¿ trim 3 mark A call p â· /2 lastmark putref 1 ââ¿ trim 4 putref 3 putvar 5 mark C putref 2 call p â¶ /2 putref 4 lastcall (p â¹ /2,3) ââ¿ mark B putvar 3 putref 5 call p âž /2
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ ââ¢tâ¡â¥â± â£râ¡ââââtâ¡s ârâ¡ ââ â£â§â¡â â¡â¥tâ¡â ââ¡ ââsâ¡ ââstââ¥âtââŠâ¥ âŠâ¥ tâ€â¡ ârst ârâ£ââ â¡â¥tâ³ ââ¡â¥ââ¡â± ââ¡ ââ¥sâ£â¡âtââ¥â£ tâ€â¡ ârst ârâ£ââ â¡â¥tâ± â ââ¥â¡ ââ§tâ¡râ¥âtâââ¡s ââ⥠ââ¡ â¡â ââ§âââ¡âⳠ⣠ââââ§ârâ¡ âs ââ¡tâ¡âtâ¡â â¡ârâ§ââ¡rⳠ⣠ââââŠtrââ⊠â£âŠââ¥ts ârâ¡ râ¡â âŠââ¡â â¡ârâ§ââ¡rⳠ⣠âtââ⊠â¢rââ â¡s ârâ¡ râ¡â âŠââ¡â â¡ârâ§ââ¡râ³
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ ââ ââ â£â§â¡â¿ app â â³â âšâ ⩠⮠⥠Ⳡâ ⬠⪠â âš â â© app â â³â âšâ ⩠⮠⥠Ⳡâ ⬠â ⥠Ⳡⵠ⪠â â© â ⬠â ⥠⩠ⵠ⪠â app â â³ âµ â âšâ â© âµ â® â ⢠tâ€â¡ ârst ârâ£ââ â¡â¥t âs [] â± tâ€â¡â¥ âŠâ¥â§â¡ tâ€â¡ ârst ââ§ââsâ¡ âs ââ£â£â§âââââ§â¡â³ â ⢠tâ€â¡ ârst ârâ£ââ â¡â¥t â€âs [|] âs âts râŠâŠt ââŠâ¥strââtâŠrâ± tâ€â¡â¥ âŠâ¥â§â¡ tâ€â¡ sâ¡ââŠâ¥â ââ§ââsâ¡ âs ââ£â£â§âââââ§â¡â³ âââ¡râ¡ âŠtâ€â¡r râŠâŠt ââŠâ¥strââtâŠr âŠâ¢ tâ€â¡ ârst ârâ£ââ â¡â¥t âââ§â§ â¢âââ§â³ ââŠt†ââ§tâ¡râ¥âtâââ¡s sâ€âŠââ§â ââ¡ trââ¡â âŠâ¥â§â¡ â⢠tâ€â¡ ârst ârâ£ââ â¡â¥t âs ââ¥ââ¥âtâââ§ââ¢â¡â âârââââ§â¡â³
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ â â¥trâŠââââ¡ â sâ¡â£ârâtâ¡ trâ¡ ââ€ââ⥠â¢âŠr â¡ââ¡râ¡ â£âŠssâââ§â¡ ââŠâ¥strââtâŠrâ³ â â¥sâ£â¡ât tâ€â¡ râŠâŠt â¥âŠââ¡ âŠâ¢ tâ€â¡ ârst ârâ£ââ â¡â¥tâ³ ââ¡â£â¡â¥âââ¥â£ âŠâ¥ tâ€â¡ râ¡sââ§tâ± â£â¡râ¢âŠrâ â⥠ââ¥ââ¡â â¡â â¥ââ ⣠t⊠tâ€â¡ ââ£â£râŠâ£rââtâ¡ trâ¡ ââ€âââ¥â³ â²â¡t tâ€â¡ â£râ¡ââââtâ¡ p/k ââ¡ââ¥â¡â ââ¡ tâ€â¡ sâ¡qââ¡â¥ââ¡ âŠâ¢ ââ§ââsâ¡s rr â r â¶ â¿ â¿ â¿ r â â³ ââ€â¡ â ââr⊠tââ€âââ¥s rr ââ¡â¥âŠtâ¡s tâ€â¡ sâ¡qââ¡â¥ââ¡ âŠâ¢ trâ¡ ââ€âââ¥s ââ€ââ†ââŠrrâ¡sâ£âŠâ¥â t⊠tâ€â¡ râŠâŠt ââŠâ¥strââtâŠrs âŠââârrââ¥â£ â⥠ââ¥ââââtââŠâ¥s â³ â¶ â t â³
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ ââ ââ â£â§â¡â¿ ââŠâ¥sâââ¡r tâ€â¡ â£râ¡ââââtâ¡ app/3 â³ â²â¡t tâ€â¡ ââŠââ¡ â¢âŠr âts tâ⊠ââ§ââsâ¡s stârt ât ââârâ¡ssâ¡s â â¶ ââ¥â â â· â³ ââ€â¡â¥ ââ¡ â£â¡t tâ€â¡ â¢âŠâ§â§âŠâââ¥â£ â¢âŠâr trâ¡ ââ€âââ¥sâ¿ â±âââ¿ setbtb // variables ââ â²â¿ jump A â¶ // [] âââââ¿ jump A â· // [|] try A â¶ delbtp ââ²âââ¿ fail // default jump A â· â â¥strââtââŠâ¥ fail â€ââ¥ââ§â¡s ââ§â§ ââŠâ¥strââtâŠrs ââ¡sâââ¡s [] ââ¥â [|] â³ â fail backtrack()
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ ââ€â¡â¥ ââ¡ â£â¡â¥â¡râtâ¡ â¢âŠr â â£râ¡ââââtâ¡ p/k â¿ ââŠââ¡ P rr â putref 1 getNode index p/k tââ€âââ¥s rr â â¶ â¿ ââŠââ¡ â r â¶ â³ â³ â³ â â â¿ ââŠââ¡ â r â
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ â â¢âŽâ¥ â¢âŽâ¥ â£â¡tââŠââ¡ â â â£â¡tââŠââ¡ switch (H[S[SP]]) { case (S,f/n): S[SP] = f/n; break; case (A,a): S[SP] = a; break; case (R, ): S[SP] = R; }
ââ§ââsâ¡ â â¥ââ¡â ââ¥â£ â â¥strââtââŠâ¥ index p/k â£â¡râ¢âŠrâ s â⥠ââ¥ââ¡â â¡â â¥ââ ⣠t⊠tâ€â¡ ââ£â£râŠâ£rââtâ¡ trâ¡ ââ€âââ¥â¿ â â â â ââ£ââ£âŽâŠâ±ââ® ââ¥ââ¡â â£âŽâŠ â Pâ PC = map(p/k,S[SP]); SP = SP - 1; ââ€â¡ â¢ââ¥âtââŠâ¥ map() râ¡târâ¥s tâ€â¡ stârt ââârâ¡ss âŠâ¢ tâ€â¡ ââ£â£râŠâ£rââtâ¡ trâ¡ ââ€âââ¥â³ ââ⥠ââ¡ ââ¡ââ¥â¡â â¡â£â³ tâ€râŠââ£â€ sâŠâ â¡ â€âs†tâââ§â¡â³
âât ââ£â¡râtâŠr â²â¡ â¡â tâ¡â¥â tâ€â¡ â§ââ¥â£âââ£â¡ PrâŠâ§â§ âât†tâ€â¡ âât âŠâ£â¡râtâŠr â§âŠâ§ ââ€ââ†â¡â â£â§âââtâ§â¡ ââ§â§âŠâs t⊠â£rââ¥â¡ tâ€â¡ sâ¡ârâ†sâ£âââ¡ âŠâ¢ ââââŠtrâââŠââ¥â£â³ ââ ââ â£â§â¡â¿ branch â â³â ⚠⮠⥠p â â³ â® â ⊠â q â¶ â â³â âš â® branch â â³â ⚠⮠⥠q â· â â³â âš â® â ⢠ââ§â§ tâ€â¡ qââ¡rââ¡s ââ¡â¢âŠrâ¡ tâ€â¡ âât â€âââ¡ sââââ¡â¡ââ¡ââ± tâ€â¡â¥ tâ€â¡ ââ€âŠâââ¡ âs ââŠâ â âttâ¡â â¿ ââââŠtrâââŠââ¥â£ âââ§â§ râ¡târ⥠âŠâ¥â§â¡ t⊠ââââŠtrââ⊠â£âŠââ¥ts â£râ¡ââ¡âââ¥â£ tâ€â¡ âââ§â§ t⊠tâ€â¡ â£râ¡ââââtâ¡â³
âât ââ£â¡râtâŠr ââ€â¡ âât âŠâ£â¡râtâŠr sâ€âŠââ§ââ¿ râ¡stâŠrâ¡ tâ€â¡ râ¡â£âstâ¡r âP ââ¡ âssââ£â¥ââ¥â£ t⊠ât âPâŠâ§â â¢râŠâ tâ€â¡ âârrâ¡â¥t â¢rââ â¡â râ¡â âŠââ¡ ââ§â§ â¢rââ â¡s ââ€ââ†ârâ¡ âŠâ¥ tâŠâ£ âŠâ¢ tâ€â¡ â§âŠâââ§ âârââââ§â¡sâ³ ââââŠrâââ¥â£â§â¡â± ââ¡ trââ¥sâ§âtâ¡ tâ€â¡ âât ââ¥t⊠tâ€â¡ sâ¡qââ¡â¥ââ¡â¿ prune pushenv m ââ€â¡râ¡ â âs tâ€â¡ â¥ââ ââ¡r âŠâ¢ âstââ§â§ ââ§âââ¡â® â§âŠâââ§ âârââââ§â¡s âŠâ¢ tâ€â¡ ââ§ââsâ¡â³
âât ââ£â¡râtâŠr ââ ââ â£â§â¡â¿ branch â â³â ⚠⮠⥠p â â³ â® â ⊠â q â¶ â â³â âš â® branch â â³â ⚠⮠⥠q â· â â³â âš â® â²â¡ âŠâtâââ¥â¿ setbtp ââ¿ pushenv 2 ââ¿ prune ââ¿ pushenv 2 try A mark C pushenv 2 putref 1 delbtp putref 1 lastmark putref 2 jump B call p/1 putref 1 move(2,2) putref 2 jump q â· /2 lastcall(q â¶ /2,2)
âât ââ£â¡râtâŠr ââ ââ â£â§â¡â¿ branch â â³â ⚠⮠⥠p â â³ â® â ⊠â q â¶ â â³â âš â® branch â â³â ⚠⮠⥠q â· â â³â âš â® â³ â³ â³ âŠrâ± ââ€â¡â¥ âsââ¥â£ âŠâ£tââ ââ¢âtââŠâ¥sâ¿ setbtp ââ¿ pushenv 2 ââ¿ prune ââ¿ pushenv 2 try A mark C pushenv 2 putref 1 delbtp putref 1 putref 1 putref 2 jump B call p/1 putref 2 move(2,2) move(2,2) jump q â· /2 jump q â¶ /2
Recommend
More recommend