code wiki / (root) / nx_sat_solver_test.nx

nx_sat_solver_test.nx source

↩ module page · 60 lines · 2481 B

1// nx_sat_solver_test.nx -- smoke for the SAT solver foundation. 2// Verifies a few well-known SAT / UNSAT instances. 3 4import "nx_syscalls.nx" 5import "nx_runtime.nx" 6import "nx_tier.nx" 7import "nx_sat_solver.nx" 8 9func main() -> nx_exit { 10 println("=== SAT solver foundation smoke ===" as *u8) 11 12 // Test 1: trivial SAT (a OR b) AND (a OR -b) -> SAT with a=TRUE 13 let f1: *SatFormula = nx_sat_alloc(2) 14 let c1a: *nx_int = (sys_mmap(16)) as *nx_int 15 c1a[0] = 1; c1a[1] = 2 // a OR b 16 let _: nx_int = nx_sat_add_clause(f1, c1a, 2) 17 let c1b: *nx_int = (sys_mmap(16)) as *nx_int 18 c1b[0] = 1; c1b[1] = -2 // a OR -b 19 let _a: nx_int = nx_sat_add_clause(f1, c1b, 2) 20 let r1: nx_int = nx_sat_solve(f1) 21 print("Test 1 (a OR b) AND (a OR -b): " as *u8) 22 if r1 == NX_SAT_SAT { println("SAT" as *u8) } 23 if r1 != NX_SAT_SAT { println("FAIL" as *u8); return 1 } 24 25 // Test 2: trivial UNSAT a AND -a 26 let f2: *SatFormula = nx_sat_alloc(1) 27 let c2a: *nx_int = (sys_mmap(8)) as *nx_int 28 c2a[0] = 1 29 let _b: nx_int = nx_sat_add_clause(f2, c2a, 1) 30 let c2b: *nx_int = (sys_mmap(8)) as *nx_int 31 c2b[0] = -1 32 let _c: nx_int = nx_sat_add_clause(f2, c2b, 1) 33 let r2: nx_int = nx_sat_solve(f2) 34 print("Test 2 (a) AND (-a): " as *u8) 35 if r2 == NX_SAT_UNSAT { println("UNSAT" as *u8) } 36 if r2 != NX_SAT_UNSAT { println("FAIL" as *u8); return 2 } 37 38 // Test 3: 3-SAT instance (a OR b OR c) AND (-a OR -b) AND (-a OR -c) AND (-b OR -c) 39 // = "exactly one of a,b,c true" -- SAT with several valid assignments 40 let f3: *SatFormula = nx_sat_alloc(3) 41 let c3a: *nx_int = (sys_mmap(24)) as *nx_int 42 c3a[0] = 1; c3a[1] = 2; c3a[2] = 3 43 let _d: nx_int = nx_sat_add_clause(f3, c3a, 3) 44 let c3b: *nx_int = (sys_mmap(16)) as *nx_int 45 c3b[0] = -1; c3b[1] = -2 46 let _e: nx_int = nx_sat_add_clause(f3, c3b, 2) 47 let c3c: *nx_int = (sys_mmap(16)) as *nx_int 48 c3c[0] = -1; c3c[1] = -3 49 let _f: nx_int = nx_sat_add_clause(f3, c3c, 2) 50 let c3d: *nx_int = (sys_mmap(16)) as *nx_int 51 c3d[0] = -2; c3d[1] = -3 52 let _g: nx_int = nx_sat_add_clause(f3, c3d, 2) 53 let r3: nx_int = nx_sat_solve(f3) 54 print("Test 3 exactly-one-of-3: " as *u8) 55 if r3 == NX_SAT_SAT { println("SAT" as *u8) } 56 if r3 != NX_SAT_SAT { println("FAIL" as *u8); return 3 } 57 58 println("=== All SAT smoke tests PASS ===" as *u8) 59 return 0 60}