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).
173 lines
8.0 KiB
EmacsLisp
173 lines
8.0 KiB
EmacsLisp
// elp.el - Engram Language Protocol — public API.
|
|
//
|
|
// Output half of the ELP: Engram semantic form → natural language surface text.
|
|
// 31 languages. Ties together language-profile, vocabulary, morphology,
|
|
// grammar, realizer, and semantics into a single entry point.
|
|
//
|
|
// Import chain (mirrors manifest.el dependency order):
|
|
// language-profile (no deps)
|
|
// vocabulary (no deps)
|
|
// morphology (depends on: language-profile)
|
|
// morphology-XX (depends on: morphology) — all language engines
|
|
// grammar (depends on: language-profile)
|
|
// realizer (depends on: morphology, grammar, language-profile)
|
|
// semantics (depends on: grammar, realizer, language-profile)
|
|
//
|
|
// When elc processes a source that imports this file, it resolves all
|
|
// transitive imports via depth-first deduplication — each module is
|
|
// inlined exactly once regardless of how many importers reference it.
|
|
|
|
// ── Base layers ───────────────────────────────────────────────────────────────
|
|
import "language-profile.el"
|
|
import "vocabulary.el"
|
|
|
|
// ── Morphology: base engine ───────────────────────────────────────────────────
|
|
import "morphology.el"
|
|
|
|
// ── Morphology: living languages ──────────────────────────────────────────────
|
|
import "morphology-es.el"
|
|
import "morphology-fr.el"
|
|
import "morphology-de.el"
|
|
import "morphology-ru.el"
|
|
import "morphology-ja.el"
|
|
import "morphology-fi.el"
|
|
import "morphology-ar.el"
|
|
import "morphology-hi.el"
|
|
import "morphology-sw.el"
|
|
|
|
// ── Morphology: ancient / classical ──────────────────────────────────────────
|
|
import "morphology-la.el"
|
|
import "morphology-he.el"
|
|
|
|
// ── Morphology: dead languages ────────────────────────────────────────────────
|
|
import "morphology-grc.el"
|
|
import "morphology-ang.el"
|
|
import "morphology-sa.el"
|
|
import "morphology-got.el"
|
|
import "morphology-non.el"
|
|
import "morphology-enm.el"
|
|
import "morphology-pi.el"
|
|
import "morphology-fro.el"
|
|
import "morphology-goh.el"
|
|
import "morphology-sga.el"
|
|
import "morphology-txb.el"
|
|
import "morphology-peo.el"
|
|
import "morphology-akk.el"
|
|
import "morphology-uga.el"
|
|
import "morphology-egy.el"
|
|
import "morphology-sux.el"
|
|
import "morphology-gez.el"
|
|
import "morphology-cop.el"
|
|
|
|
// ── Higher layers ─────────────────────────────────────────────────────────────
|
|
import "grammar.el"
|
|
import "realizer.el"
|
|
import "semantics.el"
|
|
|
|
// ── Comprehension front-end (input half: text → meaning-spec) ─────────────────
|
|
import "comprehend.el"
|
|
//
|
|
// Entry points:
|
|
//
|
|
// generate(semantic_form_json) -> String
|
|
// Low-level JSON-based API, defaults to English. SemanticForm JSON fields:
|
|
// intent - "assert" | "question" | "command"
|
|
// agent - subject (pronoun or noun phrase, optional for commands)
|
|
// predicate - verb base form
|
|
// patient - object noun phrase (optional)
|
|
// location - prepositional phrase e.g. "in the park" (optional)
|
|
// tense - "present" | "past" | "future" (default: "present")
|
|
// aspect - "simple" | "progressive" | "perfect" (default: "simple")
|
|
// lang - ISO 639-1 code (default: "en")
|
|
//
|
|
// generate_lang(semantic_form_json, lang_code) -> String
|
|
// JSON-based API with explicit language code (overrides any "lang" in JSON).
|
|
//
|
|
// generate_frame(frame: SemFrame) -> String
|
|
// High-level SemFrame API. Language from frame's "lang" field (default "en").
|
|
// Intents: "assert" | "query" | "describe" | "greet".
|
|
//
|
|
// generate_frame_lang(frame: SemFrame, lang_code: String) -> String
|
|
// High-level SemFrame API with explicit language code override.
|
|
|
|
// ── JSON helpers ──────────────────────────────────────────────────────────────
|
|
|
|
fn sem_get(json: String, key: String) -> String {
|
|
let val: String = json_get(json, key)
|
|
return val
|
|
}
|
|
|
|
// ── Public API: SemFrame ──────────────────────────────────────────────────────
|
|
|
|
// Generate text from a SemFrame in the language embedded in the frame (default "en").
|
|
fn generate_frame(frame: [String]) -> String {
|
|
return sem_realize(frame)
|
|
}
|
|
|
|
// Generate text from a SemFrame in the specified language.
|
|
fn generate_frame_lang(frame: [String], lang_code: String) -> String {
|
|
return sem_realize_lang(frame, lang_code)
|
|
}
|
|
|
|
// ── Public API: JSON ──────────────────────────────────────────────────────────
|
|
|
|
// Build a realizer slot map from JSON fields and an explicit lang code.
|
|
fn build_form_from_json(semantic_form_json: String, lang_code: String) -> [String] {
|
|
let intent: String = sem_get(semantic_form_json, "intent")
|
|
let agent: String = sem_get(semantic_form_json, "agent")
|
|
let predicate: String = sem_get(semantic_form_json, "predicate")
|
|
let patient: String = sem_get(semantic_form_json, "patient")
|
|
let location: String = sem_get(semantic_form_json, "location")
|
|
let tense: String = sem_get(semantic_form_json, "tense")
|
|
let aspect: String = sem_get(semantic_form_json, "aspect")
|
|
let polarity: String = sem_get(semantic_form_json, "polarity")
|
|
let neg_word: String = sem_get(semantic_form_json, "neg_word")
|
|
let iobj: String = sem_get(semantic_form_json, "iobj")
|
|
|
|
let form: [String] = native_list_empty()
|
|
let form = native_list_append(form, "intent")
|
|
let form = native_list_append(form, intent)
|
|
let form = native_list_append(form, "agent")
|
|
let form = native_list_append(form, agent)
|
|
let form = native_list_append(form, "predicate")
|
|
let form = native_list_append(form, predicate)
|
|
let form = native_list_append(form, "patient")
|
|
let form = native_list_append(form, patient)
|
|
let form = native_list_append(form, "iobj")
|
|
let form = native_list_append(form, iobj)
|
|
let form = native_list_append(form, "location")
|
|
let form = native_list_append(form, location)
|
|
let form = native_list_append(form, "tense")
|
|
let form = native_list_append(form, tense)
|
|
let form = native_list_append(form, "aspect")
|
|
let form = native_list_append(form, aspect)
|
|
// SACRED: polarity crosses the JSON boundary and is never inferred away.
|
|
let form = native_list_append(form, "polarity")
|
|
let form = native_list_append(form, polarity)
|
|
let form = native_list_append(form, "neg_word")
|
|
let form = native_list_append(form, neg_word)
|
|
let form = native_list_append(form, "lang")
|
|
let form = native_list_append(form, lang_code)
|
|
|
|
return form
|
|
}
|
|
|
|
// Generate text from a JSON semantic form. Language defaults to "en" unless
|
|
// the JSON contains a "lang" field.
|
|
fn generate(semantic_form_json: String) -> String {
|
|
let lang_in_json: String = sem_get(semantic_form_json, "lang")
|
|
let lang_code: String = lang_in_json
|
|
if str_eq(lang_code, "") {
|
|
let lang_code = "en"
|
|
}
|
|
let form: [String] = build_form_from_json(semantic_form_json, lang_code)
|
|
return realize(form)
|
|
}
|
|
|
|
// Generate text from a JSON semantic form in the specified language.
|
|
// lang_code overrides any "lang" field present in the JSON.
|
|
fn generate_lang(semantic_form_json: String, lang_code: String) -> String {
|
|
let form: [String] = build_form_from_json(semantic_form_json, lang_code)
|
|
return realize(form)
|
|
}
|