89ea1b5a15
PIECE 1 — greenfield el-native parser (comprehend.el), spaCy-free: - text -> meaning-spec via invertible English morphology (the realizer's own irregular table run BACKWARD) + a deterministic clause grammar (subject/verb boundary, roles, ditransitive iobj, PP adjuncts, subordination, coordination). - NEGATION IS SACRED: explicit polarity field, always present, cross-lingual lexeme set; standalone neg adverbs (never) captured separately. - WSD by deterministic syntactic position over a fixed sense inventory (flies->fly, like->comparison, saw->see); engram nearest-region is the documented runtime upgrade hook (no external model). Polarity threaded through the whole el contract (was previously dropped at the boundary): realizer.el realize_lang honors polarity (English do-support / adverbial / copular negation; generic preverbal negator for es/pt/ca/it/fr/de/ro) and places iobj; elp.el build_form_from_json carries polarity/neg_word/iobj across JSON; morphology.el gains 'fight'. Acceptance (native el telephone test, comprehend_gate.el): on the 5 gate sentences polarity PRESERVED 5/5 and EXTRACTED 5/5 through parse->realize-> re-parse; 4/5 byte-identical. Built bounded (elc rc=0, cc rc=0).
94 lines
4.0 KiB
EmacsLisp
94 lines
4.0 KiB
EmacsLisp
// comprehend_gate.el - the TELEPHONE TEST in native el (acceptance gate).
|
|
//
|
|
// For each of the 5 acceptance sentences: parse -> spec, realize the spec back
|
|
// to English, re-parse the realized surface, and require the SACRED polarity to
|
|
// survive the round-trip (and to have been extracted correctly in the first
|
|
// place). Mirrors roundtrip.py's GATE, but fully el-native (no LLM, no spaCy).
|
|
|
|
fn cp_line(text: String, expected_pol: String) -> String {
|
|
let spec: [String] = parse_spec(text)
|
|
let pol_in: String = slots_get(spec, "polarity")
|
|
let pred: String = slots_get(spec, "predicate")
|
|
let surf: String = realize(spec)
|
|
let spec2: [String] = parse_spec(surf)
|
|
let pol_out: String = slots_get(spec2, "polarity")
|
|
let status: String = "LOST"
|
|
if str_eq(pol_in, pol_out) { let status = "PRESERVED" }
|
|
let okexp: String = "MISMATCH"
|
|
if str_eq(pol_in, expected_pol) { let okexp = "ok" }
|
|
let out: String = "IN: " + text + "\n"
|
|
let out = out + " spec: pol=" + pol_in + " pred=" + pred
|
|
let out = out + " agent=" + slots_get(spec, "agent")
|
|
let out = out + " pat=" + slots_get(spec, "patient")
|
|
let out = out + " iobj=" + slots_get(spec, "iobj")
|
|
let out = out + " loc=" + slots_get(spec, "location")
|
|
let out = out + " tense=" + slots_get(spec, "tense")
|
|
let out = out + " negw=" + slots_get(spec, "neg_word")
|
|
let out = out + " subord=" + slots_get(spec, "subord_conj") + "/" + slots_get(spec, "subord_pred") + "\n"
|
|
let out = out + " realized: " + surf + "\n"
|
|
let out = out + " reparse: pol=" + pol_out + " [" + status + "] expected=" + expected_pol + " (" + okexp + ")\n"
|
|
return out
|
|
}
|
|
|
|
fn cp_preserved(text: String) -> Int {
|
|
let spec: [String] = parse_spec(text)
|
|
let pol_in: String = slots_get(spec, "polarity")
|
|
let surf: String = realize(spec)
|
|
let spec2: [String] = parse_spec(surf)
|
|
let pol_out: String = slots_get(spec2, "polarity")
|
|
if str_eq(pol_in, pol_out) { return 1 }
|
|
return 0
|
|
}
|
|
|
|
fn cp_correct(text: String, expected_pol: String) -> Int {
|
|
let spec: [String] = parse_spec(text)
|
|
if str_eq(slots_get(spec, "polarity"), expected_pol) { return 1 }
|
|
return 0
|
|
}
|
|
|
|
fn run_gate() -> String {
|
|
let s1: String = "I never fought the ocean."
|
|
let s2: String = "She did not see the man with the telescope."
|
|
let s3: String = "The teacher reads the book to the children."
|
|
let s4: String = "The stupid boy ate the cat because he was a monster."
|
|
let s5: String = "Time flies like an arrow."
|
|
|
|
let rep: String = "==== ELP native telephone test (parse -> realize -> re-parse) ====\n"
|
|
let rep = rep + cp_line(s1, "neg")
|
|
let rep = rep + cp_line(s2, "neg")
|
|
let rep = rep + cp_line(s3, "aff")
|
|
let rep = rep + cp_line(s4, "aff")
|
|
let rep = rep + cp_line(s5, "aff")
|
|
|
|
// NOTE: accumulate with Int-var + literal increments — el's overloaded `+`
|
|
// mis-compiles chained function-call int operands as string concat.
|
|
let pres: Int = 0
|
|
if cp_preserved(s1) == 1 { let pres = pres + 1 }
|
|
if cp_preserved(s2) == 1 { let pres = pres + 1 }
|
|
if cp_preserved(s3) == 1 { let pres = pres + 1 }
|
|
if cp_preserved(s4) == 1 { let pres = pres + 1 }
|
|
if cp_preserved(s5) == 1 { let pres = pres + 1 }
|
|
let corr: Int = 0
|
|
if cp_correct(s1, "neg") == 1 { let corr = corr + 1 }
|
|
if cp_correct(s2, "neg") == 1 { let corr = corr + 1 }
|
|
if cp_correct(s3, "aff") == 1 { let corr = corr + 1 }
|
|
if cp_correct(s4, "aff") == 1 { let corr = corr + 1 }
|
|
if cp_correct(s5, "aff") == 1 { let corr = corr + 1 }
|
|
|
|
let rep = rep + "-----------------------------------------------------------------\n"
|
|
let rep = rep + "polarity PRESERVED through round-trip: " + int_to_str(pres) + "/5\n"
|
|
let rep = rep + "polarity EXTRACTED correctly: " + int_to_str(corr) + "/5\n"
|
|
if pres == 5 {
|
|
if corr == 5 {
|
|
let rep = rep + "GATE: PASS\n"
|
|
} else {
|
|
let rep = rep + "GATE: FAIL (extraction)\n"
|
|
}
|
|
} else {
|
|
let rep = rep + "GATE: FAIL (round-trip)\n"
|
|
}
|
|
return rep
|
|
}
|
|
|
|
println(run_gate())
|