code wiki / (root) / nx_unify_test.nx

nx_unify_test.nx source

↩ module page · 94 lines · 4229 B

1// nx_unify_test.nx -- Robinson unification smoke. 2 3import "nx_syscalls.nx" 4import "nx_runtime.nx" 5import "nx_tier.nx" 6import "nx_result.nx" 7import "nx_unify.nx" 8 9// Symbol IDs (substitute for a real symbol table) 10const SYM_A: nx_int = 100 11const SYM_B: nx_int = 101 12const SYM_F: nx_int = 200 13const SYM_G: nx_int = 201 14 15// Var IDs 16const VAR_X: nx_int = 1 17const VAR_Y: nx_int = 2 18const VAR_Z: nx_int = 3 19 20func main() -> nx_exit { 21 println("=== Robinson unification smoke ===" as *u8) 22 23 // === Test 1: unify(x, a) -> {x -> a} ============================= 24 let t1a: *Term = nx_term_var(VAR_X) 25 let t1b: *Term = nx_term_const(SYM_A) 26 let s1: *Subst = nx_subst_new() 27 let r1: *NxResult = nx_unify(t1a, t1b, s1) 28 if nx_result_is_err(r1) == 1 { println("FAIL: t1 expected OK" as *u8); return 1 } 29 if s1.n != 1 { return 2 } 30 let bound: *Term = nx_subst_lookup(s1, VAR_X) 31 if (bound as nx_int) == 0 { return 3 } 32 if bound.kind != NX_TERM_CONST { return 4 } 33 if bound.sym != SYM_A { return 5 } 34 println(" Test 1 unify(x, a) -> {x -> a} PASS" as *u8) 35 36 // === Test 2: unify(f(x), f(a)) -> {x -> a} ======================= 37 let arg2a: *Term = (sys_mmap(NX_TERM_BYTES as i64)) as *Term 38 arg2a.kind = NX_TERM_VAR; arg2a.sym = VAR_X; arg2a.n_args = 0; arg2a.args = 0 as *Term 39 let t2a: *Term = nx_term_app(SYM_F, 1, arg2a) 40 41 let arg2b: *Term = (sys_mmap(NX_TERM_BYTES as i64)) as *Term 42 arg2b.kind = NX_TERM_CONST; arg2b.sym = SYM_A; arg2b.n_args = 0; arg2b.args = 0 as *Term 43 let t2b: *Term = nx_term_app(SYM_F, 1, arg2b) 44 45 let s2: *Subst = nx_subst_new() 46 let r2: *NxResult = nx_unify(t2a, t2b, s2) 47 if nx_result_is_err(r2) == 1 { println("FAIL: t2 expected OK" as *u8); return 10 } 48 println(" Test 2 unify(f(x), f(a)) -> {x -> a} PASS" as *u8) 49 50 // === Test 3: unify(a, b) -> ERR ================================== 51 let t3a: *Term = nx_term_const(SYM_A) 52 let t3b: *Term = nx_term_const(SYM_B) 53 let s3: *Subst = nx_subst_new() 54 let r3: *NxResult = nx_unify(t3a, t3b, s3) 55 if nx_result_is_err(r3) == 0 { println("FAIL: t3 expected ERR" as *u8); return 20 } 56 if nx_result_err_code(r3) != NX_ERR_TAG_MISMATCH { return 21 } 57 println(" Test 3 unify(a, b) -> ERR=TAG_MISMATCH PASS" as *u8) 58 59 // === Test 4: unify(x, f(x)) -> ERR occurs check ================== 60 let arg4: *Term = (sys_mmap(NX_TERM_BYTES as i64)) as *Term 61 arg4.kind = NX_TERM_VAR; arg4.sym = VAR_X; arg4.n_args = 0; arg4.args = 0 as *Term 62 let t4b: *Term = nx_term_app(SYM_F, 1, arg4) 63 let t4a: *Term = nx_term_var(VAR_X) 64 let s4: *Subst = nx_subst_new() 65 let r4: *NxResult = nx_unify(t4a, t4b, s4) 66 if nx_result_is_err(r4) == 0 { println("FAIL: t4 expected occurs-check ERR" as *u8); return 30 } 67 if nx_result_err_code(r4) != NX_ERR_INVALID_STATE { return 31 } 68 println(" Test 4 unify(x, f(x)) -> ERR=INVALID_STATE (occurs check) PASS" as *u8) 69 70 // === Test 5: unify(f(x, b), f(a, y)) -> {x -> a, y -> b} ========= 71 let args5a: *Term = (sys_mmap((2 * NX_TERM_BYTES) as i64)) as *Term 72 let arg5a0: *Term = args5a 73 arg5a0.kind = NX_TERM_VAR; arg5a0.sym = VAR_X; arg5a0.n_args = 0; arg5a0.args = 0 as *Term 74 let arg5a1: *Term = ((args5a as nx_int) + NX_TERM_BYTES) as *Term 75 arg5a1.kind = NX_TERM_CONST; arg5a1.sym = SYM_B; arg5a1.n_args = 0; arg5a1.args = 0 as *Term 76 let t5a: *Term = nx_term_app(SYM_F, 2, args5a) 77 78 let args5b: *Term = (sys_mmap((2 * NX_TERM_BYTES) as i64)) as *Term 79 let arg5b0: *Term = args5b 80 arg5b0.kind = NX_TERM_CONST; arg5b0.sym = SYM_A; arg5b0.n_args = 0; arg5b0.args = 0 as *Term 81 let arg5b1: *Term = ((args5b as nx_int) + NX_TERM_BYTES) as *Term 82 arg5b1.kind = NX_TERM_VAR; arg5b1.sym = VAR_Y; arg5b1.n_args = 0; arg5b1.args = 0 as *Term 83 let t5b: *Term = nx_term_app(SYM_F, 2, args5b) 84 85 let s5: *Subst = nx_subst_new() 86 let r5: *NxResult = nx_unify(t5a, t5b, s5) 87 if nx_result_is_err(r5) == 1 { println("FAIL: t5 expected OK" as *u8); return 40 } 88 if s5.n != 2 { return 41 } 89 println(" Test 5 unify(f(x, b), f(a, y)) -> {x -> a, y -> b} PASS" as *u8) 90 91 println("" as *u8) 92 println("=== ALL 5 Robinson unification tests PASS ===" as *u8) 93 return 0 94}