2622bb04bd
elp-input.el: replace broken engram_search_json with engram_activate_json as Layer 1. Layer 2 suppress/filter keeps nodes with non-zero salience/ importance. Reason step extracts patient from top activated node content. ELP grammar realizes the response via generate(). routes.el: add 'elp' event_type to handle_dharma_recv so the studio can route ELP requests through dharma.
385 lines
15 KiB
C
385 lines
15 KiB
C
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include "el_runtime.h"
|
|
|
|
el_val_t lang_profile(el_val_t code, el_val_t word_order, el_val_t morph_type, el_val_t has_case, el_val_t has_gender, el_val_t script_dir, el_val_t agreement, el_val_t null_subject);
|
|
el_val_t lang_get(el_val_t profile, el_val_t key);
|
|
el_val_t lang_profile_en(void);
|
|
el_val_t lang_profile_ja(void);
|
|
el_val_t lang_profile_ar(void);
|
|
el_val_t lang_profile_zh(void);
|
|
el_val_t lang_profile_de(void);
|
|
el_val_t lang_profile_es(void);
|
|
el_val_t lang_profile_fi(void);
|
|
el_val_t lang_profile_sw(void);
|
|
el_val_t lang_profile_hi(void);
|
|
el_val_t lang_profile_ru(void);
|
|
el_val_t lang_profile_fr(void);
|
|
el_val_t lang_profile_la(void);
|
|
el_val_t lang_profile_he(void);
|
|
el_val_t lang_profile_sa(void);
|
|
el_val_t lang_profile_got(void);
|
|
el_val_t lang_profile_non(void);
|
|
el_val_t lang_profile_enm(void);
|
|
el_val_t lang_profile_pi(void);
|
|
el_val_t lang_profile_grc(void);
|
|
el_val_t lang_profile_ang(void);
|
|
el_val_t lang_profile_fro(void);
|
|
el_val_t lang_profile_goh(void);
|
|
el_val_t lang_profile_sga(void);
|
|
el_val_t lang_profile_txb(void);
|
|
el_val_t lang_profile_peo(void);
|
|
el_val_t lang_profile_akk(void);
|
|
el_val_t lang_profile_uga(void);
|
|
el_val_t lang_profile_egy(void);
|
|
el_val_t lang_profile_sux(void);
|
|
el_val_t lang_profile_gez(void);
|
|
el_val_t lang_profile_cop(void);
|
|
el_val_t lang_from_code(el_val_t code);
|
|
el_val_t lang_default(void);
|
|
el_val_t lang_is_isolating(el_val_t profile);
|
|
el_val_t lang_is_agglutinative(el_val_t profile);
|
|
el_val_t lang_is_fusional(el_val_t profile);
|
|
el_val_t lang_is_polysynthetic(el_val_t profile);
|
|
el_val_t lang_is_rtl(el_val_t profile);
|
|
el_val_t lang_has_null_subject(el_val_t profile);
|
|
el_val_t lang_has_case(el_val_t profile);
|
|
el_val_t lang_has_gender(el_val_t profile);
|
|
el_val_t lang_word_order(el_val_t profile);
|
|
el_val_t lang_code(el_val_t profile);
|
|
el_val_t slots_get(el_val_t slots, el_val_t key);
|
|
el_val_t slots_set(el_val_t slots, el_val_t key, el_val_t val);
|
|
el_val_t make_slots(el_val_t k0, el_val_t v0);
|
|
el_val_t make_slots2(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1);
|
|
el_val_t make_slots3(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2);
|
|
el_val_t make_slots4(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3);
|
|
el_val_t make_slots5(el_val_t k0, el_val_t v0, el_val_t k1, el_val_t v1, el_val_t k2, el_val_t v2, el_val_t k3, el_val_t v3, el_val_t k4, el_val_t v4);
|
|
el_val_t rule_id(el_val_t rule);
|
|
el_val_t rule_lhs(el_val_t rule);
|
|
el_val_t rule_rhs_len(el_val_t rule);
|
|
el_val_t rule_rhs(el_val_t rule, el_val_t idx);
|
|
el_val_t make_rule(el_val_t id, el_val_t lhs, el_val_t r0);
|
|
el_val_t make_rule2(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1);
|
|
el_val_t make_rule3(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2);
|
|
el_val_t make_rule4(el_val_t id, el_val_t lhs, el_val_t r0, el_val_t r1, el_val_t r2, el_val_t r3);
|
|
el_val_t build_rules(void);
|
|
el_val_t get_rules(void);
|
|
el_val_t find_rule(el_val_t rule_id_str);
|
|
el_val_t make_leaf(el_val_t label, el_val_t word);
|
|
el_val_t make_node1(el_val_t label, el_val_t child0);
|
|
el_val_t make_node2(el_val_t label, el_val_t child0, el_val_t child1);
|
|
el_val_t make_node3(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2);
|
|
el_val_t make_node4(el_val_t label, el_val_t child0, el_val_t child1, el_val_t child2, el_val_t child3);
|
|
el_val_t nlg_is_ws(el_val_t c);
|
|
el_val_t skip_ws(el_val_t s, el_val_t pos);
|
|
el_val_t scan_token(el_val_t s, el_val_t start);
|
|
el_val_t render_tree(el_val_t tree);
|
|
el_val_t gram_word_order(el_val_t profile);
|
|
el_val_t gram_order_constituents(el_val_t subj, el_val_t verb, el_val_t obj, el_val_t profile);
|
|
el_val_t gram_build_vp(el_val_t verb, el_val_t aux, el_val_t profile);
|
|
el_val_t gram_question_strategy(el_val_t profile);
|
|
el_val_t is_pronoun(el_val_t word);
|
|
el_val_t build_np(el_val_t referent, el_val_t slots);
|
|
el_val_t build_pp(el_val_t loc);
|
|
el_val_t build_vp_body(el_val_t slots);
|
|
el_val_t build_vp_from_slots(el_val_t slots);
|
|
el_val_t generate_tree(el_val_t rule_id_str, el_val_t slots);
|
|
el_val_t agent_person(el_val_t agent);
|
|
el_val_t agent_number(el_val_t agent);
|
|
el_val_t realize_np(el_val_t referent, el_val_t number);
|
|
el_val_t realize_vp_lang(el_val_t base_verb, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t profile);
|
|
el_val_t realize_question_lang(el_val_t predicate, el_val_t tense, el_val_t aspect, el_val_t person, el_val_t number, el_val_t agent, el_val_t patient, el_val_t location, el_val_t profile);
|
|
el_val_t capitalize_first(el_val_t s);
|
|
el_val_t add_punct(el_val_t s, el_val_t intent);
|
|
el_val_t realize_lang(el_val_t form, el_val_t profile);
|
|
el_val_t realize(el_val_t form);
|
|
el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers);
|
|
el_val_t sem_frame_lang(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers, el_val_t lang_code);
|
|
el_val_t sem_frame_simple(el_val_t intent, el_val_t subject);
|
|
el_val_t sem_frame_obj(el_val_t intent, el_val_t subject, el_val_t obj);
|
|
el_val_t sem_intent(el_val_t frame);
|
|
el_val_t sem_subject(el_val_t frame);
|
|
el_val_t sem_object(el_val_t frame);
|
|
el_val_t sem_modifiers(el_val_t frame);
|
|
el_val_t sem_lang(el_val_t frame);
|
|
el_val_t sem_first_modifier(el_val_t mods);
|
|
el_val_t sem_intent_to_realize(el_val_t intent);
|
|
el_val_t sem_to_spec(el_val_t frame);
|
|
el_val_t sem_to_spec_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect);
|
|
el_val_t sem_realize_greet(el_val_t subject);
|
|
el_val_t sem_realize(el_val_t frame);
|
|
el_val_t sem_realize_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect);
|
|
el_val_t sem_realize_lang(el_val_t frame, el_val_t lang_code);
|
|
|
|
el_val_t sem_frame(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers) {
|
|
el_val_t r = native_list_empty();
|
|
r = native_list_append(r, EL_STR("intent"));
|
|
r = native_list_append(r, intent);
|
|
r = native_list_append(r, EL_STR("subject"));
|
|
r = native_list_append(r, subject);
|
|
r = native_list_append(r, EL_STR("object"));
|
|
r = native_list_append(r, obj);
|
|
r = native_list_append(r, EL_STR("modifiers"));
|
|
r = native_list_append(r, modifiers);
|
|
r = native_list_append(r, EL_STR("lang"));
|
|
r = native_list_append(r, EL_STR("en"));
|
|
return r;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_frame_lang(el_val_t intent, el_val_t subject, el_val_t obj, el_val_t modifiers, el_val_t lang_code) {
|
|
el_val_t r = native_list_empty();
|
|
r = native_list_append(r, EL_STR("intent"));
|
|
r = native_list_append(r, intent);
|
|
r = native_list_append(r, EL_STR("subject"));
|
|
r = native_list_append(r, subject);
|
|
r = native_list_append(r, EL_STR("object"));
|
|
r = native_list_append(r, obj);
|
|
r = native_list_append(r, EL_STR("modifiers"));
|
|
r = native_list_append(r, modifiers);
|
|
r = native_list_append(r, EL_STR("lang"));
|
|
r = native_list_append(r, lang_code);
|
|
return r;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_frame_simple(el_val_t intent, el_val_t subject) {
|
|
return sem_frame(intent, subject, EL_STR(""), EL_STR(""));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_frame_obj(el_val_t intent, el_val_t subject, el_val_t obj) {
|
|
return sem_frame(intent, subject, obj, EL_STR(""));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_intent(el_val_t frame) {
|
|
return slots_get(frame, EL_STR("intent"));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_subject(el_val_t frame) {
|
|
return slots_get(frame, EL_STR("subject"));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_object(el_val_t frame) {
|
|
return slots_get(frame, EL_STR("object"));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_modifiers(el_val_t frame) {
|
|
return slots_get(frame, EL_STR("modifiers"));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_lang(el_val_t frame) {
|
|
el_val_t code = slots_get(frame, EL_STR("lang"));
|
|
if (str_eq(code, EL_STR(""))) {
|
|
return EL_STR("en");
|
|
}
|
|
return code;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_first_modifier(el_val_t mods) {
|
|
el_val_t n = str_len(mods);
|
|
if (n == 0) {
|
|
return EL_STR("");
|
|
}
|
|
el_val_t i = 0;
|
|
el_val_t running = 1;
|
|
while (running) {
|
|
if (i >= n) {
|
|
running = 0;
|
|
} else {
|
|
el_val_t c = str_slice(mods, i, (i + 1));
|
|
if (str_eq(c, EL_STR(";"))) {
|
|
running = 0;
|
|
} else {
|
|
i = (i + 1);
|
|
}
|
|
}
|
|
}
|
|
return str_slice(mods, 0, i);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_intent_to_realize(el_val_t intent) {
|
|
if (str_eq(intent, EL_STR("assert"))) {
|
|
return EL_STR("assert");
|
|
}
|
|
if (str_eq(intent, EL_STR("query"))) {
|
|
return EL_STR("question");
|
|
}
|
|
if (str_eq(intent, EL_STR("describe"))) {
|
|
return EL_STR("assert");
|
|
}
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
return EL_STR("greet");
|
|
}
|
|
return EL_STR("assert");
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_to_spec(el_val_t frame) {
|
|
el_val_t intent = sem_intent(frame);
|
|
el_val_t subject = sem_subject(frame);
|
|
el_val_t obj = sem_object(frame);
|
|
el_val_t mods = sem_modifiers(frame);
|
|
el_val_t lang_code = sem_lang(frame);
|
|
el_val_t location = sem_first_modifier(mods);
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
el_val_t spec = native_list_empty();
|
|
spec = native_list_append(spec, EL_STR("intent"));
|
|
spec = native_list_append(spec, EL_STR("greet"));
|
|
spec = native_list_append(spec, EL_STR("agent"));
|
|
spec = native_list_append(spec, subject);
|
|
spec = native_list_append(spec, EL_STR("predicate"));
|
|
spec = native_list_append(spec, EL_STR(""));
|
|
spec = native_list_append(spec, EL_STR("patient"));
|
|
spec = native_list_append(spec, EL_STR(""));
|
|
spec = native_list_append(spec, EL_STR("location"));
|
|
spec = native_list_append(spec, EL_STR(""));
|
|
spec = native_list_append(spec, EL_STR("tense"));
|
|
spec = native_list_append(spec, EL_STR("present"));
|
|
spec = native_list_append(spec, EL_STR("aspect"));
|
|
spec = native_list_append(spec, EL_STR("simple"));
|
|
spec = native_list_append(spec, EL_STR("lang"));
|
|
spec = native_list_append(spec, lang_code);
|
|
return spec;
|
|
}
|
|
if (str_eq(intent, EL_STR("describe"))) {
|
|
el_val_t spec = native_list_empty();
|
|
spec = native_list_append(spec, EL_STR("intent"));
|
|
spec = native_list_append(spec, EL_STR("assert"));
|
|
spec = native_list_append(spec, EL_STR("agent"));
|
|
spec = native_list_append(spec, subject);
|
|
spec = native_list_append(spec, EL_STR("predicate"));
|
|
spec = native_list_append(spec, EL_STR("be"));
|
|
spec = native_list_append(spec, EL_STR("patient"));
|
|
spec = native_list_append(spec, obj);
|
|
spec = native_list_append(spec, EL_STR("location"));
|
|
spec = native_list_append(spec, location);
|
|
spec = native_list_append(spec, EL_STR("tense"));
|
|
spec = native_list_append(spec, EL_STR("present"));
|
|
spec = native_list_append(spec, EL_STR("aspect"));
|
|
spec = native_list_append(spec, EL_STR("simple"));
|
|
spec = native_list_append(spec, EL_STR("lang"));
|
|
spec = native_list_append(spec, lang_code);
|
|
return spec;
|
|
}
|
|
el_val_t realize_intent = sem_intent_to_realize(intent);
|
|
el_val_t spec = native_list_empty();
|
|
spec = native_list_append(spec, EL_STR("intent"));
|
|
spec = native_list_append(spec, realize_intent);
|
|
spec = native_list_append(spec, EL_STR("agent"));
|
|
spec = native_list_append(spec, subject);
|
|
spec = native_list_append(spec, EL_STR("predicate"));
|
|
spec = native_list_append(spec, obj);
|
|
spec = native_list_append(spec, EL_STR("patient"));
|
|
spec = native_list_append(spec, EL_STR(""));
|
|
spec = native_list_append(spec, EL_STR("location"));
|
|
spec = native_list_append(spec, location);
|
|
spec = native_list_append(spec, EL_STR("tense"));
|
|
spec = native_list_append(spec, EL_STR("present"));
|
|
spec = native_list_append(spec, EL_STR("aspect"));
|
|
spec = native_list_append(spec, EL_STR("simple"));
|
|
spec = native_list_append(spec, EL_STR("lang"));
|
|
spec = native_list_append(spec, lang_code);
|
|
return spec;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_to_spec_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect) {
|
|
el_val_t intent = sem_intent(frame);
|
|
el_val_t subject = sem_subject(frame);
|
|
el_val_t obj = sem_object(frame);
|
|
el_val_t mods = sem_modifiers(frame);
|
|
el_val_t lang_code = sem_lang(frame);
|
|
el_val_t location = sem_first_modifier(mods);
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
return sem_to_spec(frame);
|
|
}
|
|
if (str_eq(intent, EL_STR("describe"))) {
|
|
el_val_t spec = native_list_empty();
|
|
spec = native_list_append(spec, EL_STR("intent"));
|
|
spec = native_list_append(spec, EL_STR("assert"));
|
|
spec = native_list_append(spec, EL_STR("agent"));
|
|
spec = native_list_append(spec, subject);
|
|
spec = native_list_append(spec, EL_STR("predicate"));
|
|
spec = native_list_append(spec, EL_STR("be"));
|
|
spec = native_list_append(spec, EL_STR("patient"));
|
|
spec = native_list_append(spec, obj);
|
|
spec = native_list_append(spec, EL_STR("location"));
|
|
spec = native_list_append(spec, location);
|
|
spec = native_list_append(spec, EL_STR("tense"));
|
|
spec = native_list_append(spec, tense);
|
|
spec = native_list_append(spec, EL_STR("aspect"));
|
|
spec = native_list_append(spec, aspect);
|
|
spec = native_list_append(spec, EL_STR("lang"));
|
|
spec = native_list_append(spec, lang_code);
|
|
return spec;
|
|
}
|
|
el_val_t realize_intent = sem_intent_to_realize(intent);
|
|
el_val_t spec = native_list_empty();
|
|
spec = native_list_append(spec, EL_STR("intent"));
|
|
spec = native_list_append(spec, realize_intent);
|
|
spec = native_list_append(spec, EL_STR("agent"));
|
|
spec = native_list_append(spec, subject);
|
|
spec = native_list_append(spec, EL_STR("predicate"));
|
|
spec = native_list_append(spec, verb);
|
|
spec = native_list_append(spec, EL_STR("patient"));
|
|
spec = native_list_append(spec, obj);
|
|
spec = native_list_append(spec, EL_STR("location"));
|
|
spec = native_list_append(spec, location);
|
|
spec = native_list_append(spec, EL_STR("tense"));
|
|
spec = native_list_append(spec, tense);
|
|
spec = native_list_append(spec, EL_STR("aspect"));
|
|
spec = native_list_append(spec, aspect);
|
|
spec = native_list_append(spec, EL_STR("lang"));
|
|
spec = native_list_append(spec, lang_code);
|
|
return spec;
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_realize_greet(el_val_t subject) {
|
|
if (str_eq(subject, EL_STR(""))) {
|
|
return EL_STR("Hello.");
|
|
}
|
|
return el_str_concat(el_str_concat(EL_STR("Hello, "), subject), EL_STR("."));
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_realize(el_val_t frame) {
|
|
el_val_t intent = sem_intent(frame);
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
return sem_realize_greet(sem_subject(frame));
|
|
}
|
|
el_val_t spec = sem_to_spec(frame);
|
|
return realize(spec);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_realize_full(el_val_t frame, el_val_t verb, el_val_t tense, el_val_t aspect) {
|
|
el_val_t intent = sem_intent(frame);
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
return sem_realize_greet(sem_subject(frame));
|
|
}
|
|
el_val_t spec = sem_to_spec_full(frame, verb, tense, aspect);
|
|
return realize(spec);
|
|
return 0;
|
|
}
|
|
|
|
el_val_t sem_realize_lang(el_val_t frame, el_val_t lang_code) {
|
|
el_val_t intent = sem_intent(frame);
|
|
if (str_eq(intent, EL_STR("greet"))) {
|
|
return sem_realize_greet(sem_subject(frame));
|
|
}
|
|
el_val_t patched = slots_set(frame, EL_STR("lang"), lang_code);
|
|
el_val_t spec = sem_to_spec(patched);
|
|
return realize(spec);
|
|
return 0;
|
|
}
|
|
|