Spaces:
Running
Running
| :- module(serialize, [ | |
| serialize_tree/2, | |
| serialize_agreement/5, | |
| serialize_validate/3, | |
| serialize_interference/2, | |
| serialize_transform/4 | |
| ]). | |
| :- use_module(lexicon). | |
| :- use_module(agreement). | |
| :- use_module(xbar). | |
| :- use_module(binding). | |
| :- use_module(subcategorization). | |
| :- use_module(contrastive). | |
| :- use_module(movement). | |
| %% ========================================================================== | |
| %% Serialization helpers — convert compound Prolog terms into nested lists | |
| %% that pyswip can marshal cleanly to Python (atoms + lists only). | |
| %% ========================================================================== | |
| %% --- serialize_tree(+GestureIDs, -TreeList) --- | |
| %% Parses and serializes the X-bar tree as nested lists. | |
| %% Each node: [Label, Children...] where Children are also nested lists. | |
| serialize_tree(GestureIDs, TreeList) :- | |
| parse_sentence(GestureIDs, Tree, []), | |
| !, | |
| term_to_list(Tree, TreeList). | |
| serialize_tree(_, []). | |
| %% --- term_to_list: recursive compound term → nested list --- | |
| term_to_list(Term, [Functor|ArgLists]) :- | |
| compound(Term), | |
| Term =.. [Functor|Args], | |
| maplist(term_to_list, Args, ArgLists), | |
| !. | |
| term_to_list(Atom, Atom) :- | |
| atom(Atom), !. | |
| term_to_list(Num, Num) :- | |
| number(Num), !. | |
| term_to_list(List, Serialized) :- | |
| is_list(List), | |
| !, | |
| maplist(term_to_list, List, Serialized). | |
| term_to_list(Other, Other). | |
| %% --- serialize_agreement(+SubjID, +VerbID, -Agrees, -InflectedForm, -AgrFeatsFlat) --- | |
| serialize_agreement(SubjID, VerbID, Agrees, InflectedForm, AgrFeatsFlat) :- | |
| lex(SubjID, _, _, SF), | |
| lex(VerbID, _, _, VF), | |
| check_agreement(SF, VerbID, VF, Result), | |
| !, | |
| (Result = agree(InflectedForm, AgrFeats) -> | |
| Agrees = yes, | |
| flatten_feats(AgrFeats, AgrFeatsFlat) | |
| ; | |
| Result = disagree(InflectedForm, _), | |
| Agrees = no, | |
| AgrFeatsFlat = [] | |
| ). | |
| serialize_agreement(_, _, no, unknown, []). | |
| %% --- flatten_feats: [k=v, ...] → [k, v, k, v, ...] --- | |
| flatten_feats([], []). | |
| flatten_feats([K=V|Rest], [K, V|FlatRest]) :- | |
| flatten_feats(Rest, FlatRest). | |
| flatten_feats([_|Rest], FlatRest) :- | |
| flatten_feats(Rest, FlatRest). | |
| %% --- serialize_validate(+GestureIDs, -Grammatical, -ResultPairs) --- | |
| %% Returns flattened key-value pairs for the validation result. | |
| serialize_validate(GestureIDs, Grammatical, ResultPairs) :- | |
| %% 1. Try parse | |
| (parse_sentence(GestureIDs, _, []) -> | |
| Grammatical = yes, ParseOk = yes | |
| ; | |
| Grammatical = no, ParseOk = no | |
| ), | |
| %% 2. Theta check | |
| find_verb_id(GestureIDs, VerbID), | |
| (VerbID \= none -> | |
| exclude_id(GestureIDs, VerbID, ArgIDs), | |
| check_theta_criterion(VerbID, ArgIDs, ThetaResult), | |
| (ThetaResult = satisfied -> ThetaSat = yes ; ThetaSat = no) | |
| ; | |
| ThetaSat = unknown, _ThetaResult = none | |
| ), | |
| %% 3. Binding check | |
| check_binding(GestureIDs, local, BindingViolations), | |
| length(BindingViolations, NBindViol), | |
| ResultPairs = [parse_ok, ParseOk, theta_satisfied, ThetaSat, binding_violations, NBindViol]. | |
| %% --- serialize_interference(+GestureIDs, -PatternsList) --- | |
| %% Each pattern: [Type, Severity, Description] | |
| serialize_interference(GestureIDs, PatternsList) :- | |
| detect_interference(GestureIDs, Interferences), | |
| maplist(interference_to_list, Interferences, PatternsList). | |
| interference_to_list(interference(Type, Severity, Desc), [Type, Severity, Desc]). | |
| %% --- serialize_transform(+GestureIDs, -EnglishOrder, -TransformType, -OpsList) --- | |
| serialize_transform(GestureIDs, EnglishOrder, TransformType, OpsList) :- | |
| transform_isl_to_english(GestureIDs, EnglishOrder, Record), | |
| (Record = transform(TransformType, Ops) -> | |
| maplist(op_to_list, Ops, OpsList) | |
| ; | |
| TransformType = unknown, OpsList = [] | |
| ). | |
| op_to_list(operation(Name, Desc), [Name, Desc]). | |
| %% --- Helpers --- | |
| find_verb_id([], none). | |
| find_verb_id([ID|_], ID) :- lex(ID, _, v, _), !. | |
| find_verb_id([_|Rest], VID) :- find_verb_id(Rest, VID). | |
| exclude_id([], _, []). | |
| exclude_id([ID|Rest], ID, Result) :- !, exclude_id(Rest, ID, Result). | |
| exclude_id([ID|Rest], ExID, [ID|Result]) :- exclude_id(Rest, ExID, Result). | |