code wiki / (root) / nx_stmt_gate.nx

nx_stmt_gate.nx source

↩ module page · 181 lines · 7518 B

1// nx_stmt_gate.nx -- F985 INDEPENDENT GATE: statements derived from the ledger. 2// Builds a real business on the ledger (owner capital in, cash spent, revenue earned) and proves the 3// accounting equation holds BY DERIVATION at every step -- nobody types a balance-sheet figure -- and 4// that an unresolvable account REFUSES the whole statement rather than quietly dropping it. 5// license_tier: ORIGINAL No hw writes (Rule 26). expect_exit: 0 6 7import "nx_stmt_lib.nx" 8 9func sg_puts(s: *u8) -> i64 { 10 var n: i64 = 0 11 while s[n] != (0 as u8) { n = n + 1 } 12 sys_write(1, s, n) 13 return 0 14} 15func sg_putn(v: i64) -> i64 { 16 let t: *u8 = sys_mmap(32) 17 var o: i64 = 0 18 var m: i64 = v 19 if m < 0 { t[o] = 45 as u8; o = o + 1; m = 0 - m } 20 let d: *u8 = sys_mmap(32) 21 var k: i64 = 0 22 if m == 0 { d[0] = 48 as u8; k = 1 } 23 while m > 0 { d[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 24 var i: i64 = 0 25 while i < k { t[o] = d[k - 1 - i]; o = o + 1; i = i + 1 } 26 sys_write(1, t, o) 27 return 0 28} 29func sg_ck(cnt: *i64, name: *u8, got: i64, want: i64) -> i64 { 30 if got == want { 31 cnt[0] = cnt[0] + 1 32 sg_puts(" PASS " as *u8); sg_puts(name); sg_puts(" = " as *u8); sg_putn(got); sg_puts("\n" as *u8) 33 return 1 34 } 35 cnt[1] = cnt[1] + 1 36 sg_puts(" FAIL " as *u8); sg_puts(name); sg_puts(" got " as *u8); sg_putn(got) 37 sg_puts(" want " as *u8); sg_putn(want); sg_puts("\n" as *u8) 38 return 0 39} 40func sg_id(tag: *u8, nonce: i64, out: *u8) -> i64 { 41 var o: i64 = mt_catcopy(out, 0, tag) 42 o = mt_catn(out, o, nonce) 43 out[o] = 0 as u8 44 return o 45} 46 47func main(argc: i64, argv: *i64) -> i64 { 48 let lp: *u8 = "knowledge/store/stmtgate-led-" as *u8 49 let cp: *u8 = "knowledge/store/stmtgate-coa-" as *u8 50 let nonce: i64 = sys_now_us() 51 let cnt: *i64 = sys_mmap(16) as *i64 52 cnt[0] = 0 53 cnt[1] = 0 54 55 let cash: *u8 = sys_mmap(64) 56 let note: *u8 = sys_mmap(64) 57 let cap: *u8 = sys_mmap(64) 58 let rev: *u8 = sys_mmap(64) 59 let exp: *u8 = sys_mmap(64) 60 let ghost: *u8 = sys_mmap(64) 61 sg_id("cash_" as *u8, nonce, cash) 62 sg_id("note_" as *u8, nonce, note) 63 sg_id("capital_" as *u8, nonce, cap) 64 sg_id("revenue_" as *u8, nonce, rev) 65 sg_id("rent_" as *u8, nonce, exp) 66 sg_id("ghost_" as *u8, nonce, ghost) 67 68 let t1: *u8 = sys_mmap(64) 69 let t2: *u8 = sys_mmap(64) 70 let t3: *u8 = sys_mmap(64) 71 let t4: *u8 = sys_mmap(64) 72 sg_id("s1_" as *u8, nonce, t1) 73 sg_id("s2_" as *u8, nonce, t2) 74 sg_id("s3_" as *u8, nonce, t3) 75 sg_id("s4_" as *u8, nonce, t4) 76 77 // the data-driven side map 78 coa_type_put(cp, "asset" as *u8, "debit" as *u8) 79 coa_type_put(cp, "liability" as *u8, "credit" as *u8) 80 coa_type_put(cp, "equity" as *u8, "credit" as *u8) 81 coa_type_put(cp, "revenue" as *u8, "credit" as *u8) 82 coa_type_put(cp, "expense" as *u8, "debit" as *u8) 83 coa_put(cp, cash, "asset" as *u8) 84 coa_put(cp, note, "liability" as *u8) 85 coa_put(cp, cap, "equity" as *u8) 86 coa_put(cp, rev, "revenue" as *u8) 87 coa_put(cp, exp, "expense" as *u8) 88 89 let bs: *i64 = sys_mmap(8 * 8) as *i64 90 let inc: *i64 = sys_mmap(8 * 8) as *i64 91 let tb: *i64 = sys_mmap(8 * 8) as *i64 92 93 let accts: *i64 = sys_mmap(8 * 5) as *i64 94 accts[0] = cash as i64 95 accts[1] = note as i64 96 accts[2] = cap as i64 97 accts[3] = rev as i64 98 accts[4] = exp as i64 99 100 sg_puts("NISHI-STMT-GATE (F985 statements DERIVED from the ledger, never typed)\n" as *u8) 101 102 // 1) owner puts in $5000.00 capital -> debit cash, credit capital 103 led_xfer(lp, t1, cash, cap, 500000, "posted" as *u8) 104 // 2) borrow $2000.00 on a note -> debit cash, credit note payable 105 led_xfer(lp, t2, cash, note, 200000, "posted" as *u8) 106 107 // ---- S1: the accounting equation holds with ZERO figures typed ---- 108 sg_ck(cnt, "S1 balance sheet derived AND balanced (1)" as *u8, 109 stmt_balance_sheet(lp, cp, accts, 5, bs), 1) 110 sg_ck(cnt, "S1a assets $7000.00" as *u8, bs[0], 700000) 111 sg_ck(cnt, "S1b liabilities $2000.00" as *u8, bs[1], 200000) 112 sg_ck(cnt, "S1c equity $5000.00" as *u8, bs[2], 500000) 113 sg_ck(cnt, "S1d variance assets-(liab+equity)" as *u8, bs[3], 0) 114 115 // 3) earn $1500.00 revenue in cash -> debit cash, credit revenue 116 led_xfer(lp, t3, cash, rev, 150000, "posted" as *u8) 117 // 4) pay $400.00 rent -> debit rent expense, credit cash 118 led_xfer(lp, t4, exp, cash, 40000, "posted" as *u8) 119 120 // ---- S2: income statement derived ---- 121 sg_ck(cnt, "S2 income statement derived (1)" as *u8, stmt_income(lp, cp, accts, 5, inc), 1) 122 sg_ck(cnt, "S2a revenue $1500.00" as *u8, inc[0], 150000) 123 sg_ck(cnt, "S2b expenses $400.00" as *u8, inc[1], 40000) 124 sg_ck(cnt, "S2c NET INCOME $1100.00" as *u8, inc[2], 110000) 125 126 // ---- S3: cash is the sum of every cash movement, derived ---- 127 let one: *i64 = sys_mmap(16) as *i64 128 coa_natural(lp, cp, cash, one) 129 sg_ck(cnt, "S3 cash = 5000+2000+1500-400 = $8100.00" as *u8, one[0], 810000) 130 131 // ---- S4: THE LINK. Assets now exceed liabilities+equity by EXACTLY net income, ---- 132 // because revenue/expense have not been closed to equity yet. This is the real 133 // articulation between the two statements, and it is DERIVED, not asserted. 134 stmt_balance_sheet(lp, cp, accts, 5, bs) 135 sg_ck(cnt, "S4 pre-close variance EQUALS net income (statement articulation)" as *u8, 136 bs[3], inc[2]) 137 138 // ---- S5: close the books -- move net income into equity, equation returns to 0 ---- 139 let tc: *u8 = sys_mmap(64) 140 sg_id("close_" as *u8, nonce, tc) 141 led_xfer(lp, tc, rev, cap, 150000, "posted" as *u8) 142 let tc2: *u8 = sys_mmap(64) 143 sg_id("close2_" as *u8, nonce, tc2) 144 led_xfer(lp, tc2, cap, exp, 40000, "posted" as *u8) 145 sg_ck(cnt, "S5 after closing entries the equation BALANCES again" as *u8, 146 stmt_balance_sheet(lp, cp, accts, 5, bs), 1) 147 sg_ck(cnt, "S5a variance back to zero" as *u8, bs[3], 0) 148 sg_ck(cnt, "S5b equity absorbed net income: $5000 + $1100" as *u8, bs[2], 610000) 149 150 // ---- S6: trial balance -- total debits == total credits across the book ---- 151 sg_ck(cnt, "S6 trial balance: debits == credits (1)" as *u8, 152 stmt_trial_balance(lp, accts, 5, tb), 1) 153 154 // ---- S7: FAIL-CLOSED. An unresolvable account REFUSES the whole statement. ---- 155 // A balance sheet that silently drops an account it did not understand is the worst 156 // possible failure: authoritative-looking and wrong. 157 let accts2: *i64 = sys_mmap(8 * 6) as *i64 158 accts2[0] = cash as i64 159 accts2[1] = note as i64 160 accts2[2] = cap as i64 161 accts2[3] = rev as i64 162 accts2[4] = exp as i64 163 accts2[5] = ghost as i64 164 bs[3] = 999999 165 sg_ck(cnt, "S7 unregistered account REFUSES the balance sheet (0)" as *u8, 166 stmt_balance_sheet(lp, cp, accts2, 6, bs), 0) 167 sg_ck(cnt, "S7a refusal wrote NO variance (not silently dropped)" as *u8, bs[3], 999999) 168 sg_ck(cnt, "S7b unregistered account REFUSES the income statement too" as *u8, 169 stmt_income(lp, cp, accts2, 6, inc), 0) 170 171 sg_puts("nx_stmt_gate: pass=" as *u8); sg_putn(cnt[0]) 172 sg_puts(" fail=" as *u8); sg_putn(cnt[1]); sg_puts("\n" as *u8) 173 if cnt[1] == 0 { 174 sg_puts("F985 nx_stmt: VERDICT=GREEN (equation derived not typed, articulation proven, fail-closed on omission)\n" as *u8) 175 sys_exit(0) 176 return 0 177 } 178 sg_puts("F985 nx_stmt: VERDICT=RED\n" as *u8) 179 sys_exit(1) 180 return 1 181}