Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 74 additions & 92 deletions spec/v0.2-grammar.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,98 +98,80 @@ Example:

### 3.1 Abstract Concepts (2-char)

| CodeEnglish |
|------|---------|------|
| `li` |
| `de` |
| `lo` |
| `fe` |
| `ho` |
| `be` |
| `dr` |
| `re`y |
| `il` |
| `fr` |
| `bo`y |
| `ch` |
| `gr` |
| `pa` |
| `em` |
| `sy`ystem |
| `la` |
| `wo` |
| `se` |
| `ot` |
| `wo` |
| `un` |
| `na` |
| `ar` |
| `or` |
| `pu` |
| `me` |
| `va` |
| `qu` |
| `an` |
| `kn` |
| `wi` |
| `po` |
| `we` |
| `st` |
| `ne` |
| `ol` |
| `bi` |
| `en` |
| `be` |
| `mi` |
| `bo`y |
| `so` |
| `th` |
| `fe` |
| `pe` |
| `aw` |
| `at` |
| `in` |
| `de` |
| `ac` |
| `re` |
| `ca` |
| `ef` |
| `pr` |
| `ev` |
| `st` |
| `fo` |
| `su` |
| `ex` |
| `le` |
| `te` |
| `cr` |
| `de`y |
| `bu` |
| `co` |
| `se` |
| `un` |
| `di` |
| `sh` |
| `gi` |
| `ta` |
| `se` |
| `fi` |
| `lo` |
| `ke` |
| `ch` |
| `wa` |
| `mo` |
| `re` |
| `sp` |
| `li` |
| `wr` |
| `re` |
| `as` |
| `te` |
| `sh` |
| `hi` |
| `op` |
| `cl` |
| Code | English |
|------|---------|
| `li` | |
| `de` | |
| `lo` | |
| `fe` | |
| `ho` | |
| `be` | |
| `dr` | |
| `re` | reality |
| `il` | |
| `fr` | |
| `bo` | |
| `ch` | |
| `gr` | |
| `pa` | |
| `em` | |
| `sy` | system |
| `la` | |
| `wo` | |
| `se` | |
| `ot` | |
| `un` | |
| `na` | |
| `ar` | |
| `or` | |
| `pu` | |
| `me` | |
| `va` | |
| `qu` | |
| `an` | |
| `kn` | |
| `wi` | |
| `po` | |
| `we` | |
| `st` | |
| `ne` | |
| `ol` | |
| `bi` | |
| `en` | |
| `mi` | |
| `so` | |
| `th` | |
| `pe` | |
| `aw` | |
| `at` | |
| `in` | |
| `ac` | |
| `ca` | |
| `ef` | |
| `pr` | |
| `ev` | |
| `fo` | |
| `su` | |
| `ex` | |
| `le` | |
| `te` | |
| `cr` | |
| `bu` | |
| `co` | |
| `di` | |
| `sh` | |
| `gi` | |
| `ta` | |
| `fi` | |
| `ke` | |
| `wa` | |
| `mo` | |
| `sp` | |
| `wr` | |
| `as` | |
| `hi` | |
| `op` | |
| `cl` | |

### 3.2 Connectives (1-char)

Expand Down
6 changes: 0 additions & 6 deletions src/atoms.json
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,6 @@
"ok": {"en": "success"},
"no": {"en": "not/negation"},
"if": {"en": "if/condition"},
"th": {"en": "thought"},
"tn": {"en": "then"},
"el": {"en": "else"},
"da": {"en": "data"},
Expand Down Expand Up @@ -141,7 +140,6 @@
"pt": {"en": "part"},
"em": {"en": "emergence"},
"eo": {"en": "evolve"},
"sy": {"en": "system"},
"sb": {"en": "symbol"},
"mi": {"en": "mind"},
"mn": {"en": "minimal"},
Expand All @@ -164,13 +162,11 @@
"su": {"en": "substance"},
"ex": {"en": "experience"},
"ep": {"en": "express"},
"le": {"en": "learn"},
"te": {"en": "teach"},
"cr": {"en": "create"},
"bu": {"en": "build"},
"sh": {"en": "share"},
"sw": {"en": "show"},
"gi": {"en": "give"},
"ke": {"en": "keep"},
"wa": {"en": "wait"},
"ws": {"en": "waste"},
Expand Down Expand Up @@ -240,11 +236,9 @@
"av": {"en": "approve"},
"dn": {"en": "deny"},
"fi": {"en": "finish"},
"ct": {"en": "complete"},
"es": {"en": "essential"},
"im": {"en": "important"},
"cc": {"en": "critical"},
"vf": {"en": "verify"},
"au": {"en": "authenticate"},
"sc": {"en": "secure"},
"dt": {"en": "detect"},
Expand Down
62 changes: 40 additions & 22 deletions src/lambda_lang.py
Original file line number Diff line number Diff line change
Expand Up @@ -434,29 +434,47 @@ def english_to_lambda(text: str) -> str:
# Build comprehensive reverse lookup (English -> Lambda)
rev = {}

# Add all categories
for cat in ["entities", "verbs", "modifiers", "time", "quantifiers"]:
for k, v in ATOMS.get(cat, {}).items():
for word in v["en"].lower().replace("/", " ").split():
word = word.strip("()")
if word and word not in rev:
rev[word] = k

# Add extended vocabulary
for k, v in ATOMS.get("extended", {}).items():
for word in v["en"].lower().replace("/", " ").split():
word = word.strip("()")
if word and word not in rev:
rev[word] = k

# Add domain atoms with prefixes
def _iter_words(en_value: str):
"""Yield normalized tokens from an English description."""
normalized = en_value.lower().replace("/", " ").replace("-", " ")
for part in normalized.split():
word = re.sub(r"[^a-z0-9']", "", part.strip("()")).strip("'")
if word:
yield word

def _add_mapping(word: str, token: str):
if word and word not in rev:
rev[word] = token

# Iterate all categories defined in ATOMS (except metadata and domains)
for category, entries in ATOMS.items():
if category in {"version", "changelog", "domains"}:
continue
if not isinstance(entries, dict):
continue
for atom, data in entries.items():
if atom == "_meta" or not isinstance(data, dict):
continue
en_value = data.get("en")
if not isinstance(en_value, str):
continue
for word in _iter_words(en_value):
_add_mapping(word, atom)

# Include domain-specific atoms with domain prefixes
for domain_code, domain_data in ATOMS.get("domains", {}).items():
domain_prefix = {"cd": "c", "vb": "v", "sc": "s", "emo": "e", "soc": "o"}.get(domain_code, domain_code)
for atom, atom_data in domain_data.get("atoms", {}).items():
for word in atom_data["en"].lower().replace("/", " ").split():
word = word.strip("()")
if word and word not in rev:
rev[word] = f"{domain_prefix}:{atom}"
atoms = domain_data.get("atoms", {})
if not isinstance(atoms, dict):
continue
for atom, atom_data in atoms.items():
if atom == "_meta" or not isinstance(atom_data, dict):
continue
en_value = atom_data.get("en")
if not isinstance(en_value, str):
continue
token = f"{domain_code}:{atom}"
for word in _iter_words(en_value):
_add_mapping(word, token)

# Add common word mappings (these override domain atoms when more specific)
rev.update({
Expand Down