1/*
    2
    3This file translates CG from CGPro form to FOL .
    4Different types of referents that the 
    5Translator handles are incrementally added to the system. 
    6Allowed types of referents:
    7- generic [PERSON: *] <-> exists(x,person(x))
    8- named concept [PERSON: John] <-> exists(x,person(x)&name(x,'John')&word('John'))
    9- universally quantified concept [PERSON: every] <-> all(Y,person(Y)-> ...)
   10- collective sets of named concepts [PERSON: {John,Sally}]
   11
   12*/
   13
   14
   15:- dynamic(kb_index/1).   16
   17:- op(850,fx,~).    % negation
   18:- op(900,xfy,'#').   % disjunction
   19:- op(900,xfy,&).   % conjunction
   20:- op(950,xfy,->).  % implication
   21
   22
   23
   24:- dynamic seed1/1.   25
   26/* This predicate returns the concatenation of two atoms as an atom */
   27    
   28a_concat(S1,S2,S):-
   29    name(S1,L1),name(S2,L2),append(L1,L2,L),
   30    name(S,L).
   31    
   32    
   33seed1(0).
   34
   35concat1(S1,S2,S):-
   36    name(S1,L1),name(S2,L2),append(L1,L2,L),
   37    name(S,L).
   38
   39
   40translate_ind(ind(_A,Name,Ind),S):- S=..[Name,Ind].
   41
   42% translate_pred_id(Id,F):-
   43% cg(Id,A,B,C),translate_cgraph(cg(Id,A,B,C),F).
   44translate_cgraph(Id,Formula):- var(Id),!, isCG(Id),translate_cgraph(Id,Formula).
   45translate_cgraph(Id,Formula):- number(Id),!,cg(Id,Rels,A,B),translate_cgraph(cg(Id,Rels,A,B),Formula).
   46translate_cgraph(cg(Id,Rels,A,B),Formula):-
   47    expand_names(cg(Id,Rels,A,B),cg(Id,Rels1,A,B)),
   48    translate_cg(cg(Id,Rels1,A,B),Formula).
   49
   50translate_cg(cg(_,Rels,_,_),Formula):-
   51    get_concepts_pred(Rels,CIDs),
   52    assign_varsn_pred(CIDs,ListIdsConcs),
   53    make_formula(Rels,ListIdsConcs,FormulaBody),
   54    make_cg_prefix1(ListIdsConcs,Formula, FormulaBody),guess_varnames(Formula).
   55
   56expand_names(cg(Id,Rels,A,B),cg(Id,Rels1,A,B)):-
   57    get_named_concepts(Rels,CIDs),
   58    add_relations(CIDs,Relations),
   59    append(Rels,Relations,Rels1).
   60
   61add_relations([],[]).
   62add_relations([Id|Next],[Rel|Next1]):-
   63    cgc(Id,_,_,Ref,_),ground(Ref),
   64    member(fs(name,Name),Ref),
   65    kb_index(X),
   66    X1 is X+1,
   67    assert(ind(X1,word,Name)),
   68    retract(kb_index(X)),
   69    assert(kb_index(X1)),
   70    Rel=cgr(name,[Id,X1],_),
   71    add_relations(Next,Next1).
   72
   73
   74
   75get_named_concepts([],[]).
   76
   77get_named_concepts([cgr(_,Ids,_)|Next],List) :- 
   78    get_named_concepts(Next,List1),
   79    get_n_concepts(Ids,Ids1),
   80    append3_pred(Ids1,List1,List).
   81
   82get_n_concepts([],[]).
   83
   84get_n_concepts([Id|Next],[Id|Next1]):-
   85    cgc(Id,simple,_,Ref,_),ground(Ref),
   86    member(fs(name,_),Ref), 
   87    \+ member(fs(num,pl),Ref),!,
   88    get_n_concepts(Next,Next1). 	
   89
   90get_n_concepts([_|Next],Next1):-
   91    get_n_concepts(Next,Next1).
   92
   93get_concepts_pred([],[]).
   94
   95get_concepts_pred([cgr(_,Ids,_)|Next],List) :- 
   96    get_concepts_pred(Next,List1),
   97    append3_pred(Ids,List1,List).
   98    
   99assign_vars([],[]).
  100assign_vars([Id|Next],[Id-_Var|NextVars]):- 
  101    cgc(Id,simple,_,_,_),!,
  102    assign_vars(Next,NextVars).
  103
  104assign_vars([Id|Next],[ind-Id|NextVars]):-
  105    ind(Id,_,_),
  106    assign_vars(Next,NextVars).
  107
  108
  109assign_vars([Id|Next],[cg-Id|NextVars]):-
  110    cgc(Id,situation,_,_,_),
  111    assign_vars(Next,NextVars).
  112assign_varsn_pred([],[]).
  113assign_varsn_pred([Id|Next],[Id-Var|NextVars]):- 
  114    cgc(Id,_,_,_,_),!,next_var_pred(Var),
  115    assign_varsn_pred(Next,NextVars).
  116assign_varsn_pred([Id|Next],[_Var-Id|NextVars]):-
  117    assign_varsn_pred(Next,NextVars).
  118
  119
  120next_var_pred(_):- !.
  121next_var_pred(?(Var)):- retract(seed1(N)),
  122    N1 is N+1,
  123    assert(seed1(N1)),
  124    concat1('a',N,Var).
  125    
  126
  127
  128
  129append3_pred([],L,L).
  130append3_pred([H|T],L,Lresult):-member(H,L),!,
  131    append3_pred(T,L,Lresult).
  132
  133append3_pred([H|T],L,[H|Lresult]):- append3_pred(T,L,Lresult).
  134
  135
  136make_cg_prefix1([] ,F,F).
  137make_cg_prefix1([Id-_Var|Next],F,F1):- (Id=ind;Id=cg),!, make_cg_prefix1(Next,F,F1).
  138make_cg_prefix1([Id-Var|Next],F,F1):-  cgc(Id,simple,Name,Refs,_),ground(Refs),
  139    member(fs(quant,every),Refs),
  140    \+ member(fs(number,pl),Refs),!,
  141    T=..[Name,Var],
  142    F=..[all,Var,F2],
  143    F2=..[->, T ,F3],
  144    make_cg_prefix1(Next,F3,F1).
  145
  146make_cg_prefix1([_Id-Var|Next],F,F1):-  F2=..[exists,Var,F1], 
  147    make_cg_prefix1(Next,F,F2).
  148
  149
  150make_formula([cgr(Rname,Ids,_)|OtherRels],ListIdsConcs,F):- 
  151    make_formula(OtherRels,ListIdsConcs,F1),!,
  152    construct_term(Rname,Ids,ListIdsConcs,Term),
  153    ( F1=[] -> F=Term;
  154    F=.. [&, Term, F1]).
  155
  156make_formula([],[Id- _Var|Next],F):-
  157    make_formula([],Next,F1),
  158    cgc(Id,_,_Name,Refs,_),
  159    sing_every(Refs),!,
  160    F=F1.
  161
  162make_formula([],[Id-Var|Next],F):-
  163    make_formula([],Next,F1),
  164    cgc(Id,_,Name,_,_),!,
  165    construct_term(Name,[Id],[Id-Var],Term),
  166    ( F1=[] -> F=Term;
  167    F=.. [&, Term, F1]).
  168
  169make_formula([],[_Var-Id|Next],F):-
  170    make_formula([],Next,F1),
  171    ind(Id,Type,Ind),!,
  172    Term=..[Type,Ind],
  173    ( F1=[] -> F=Term;
  174    F=.. [&, Term, F1]).
  175
  176
  177make_formula([],[_Var-Id|Next],F):-
  178    cgc(Id,situation,_,[_GID],_),
  179    make_formula([],Next,F).
  180
  181
  182
  183make_formula([],[],[]).
  184
  185
  186
  187construct_term(not,[Id],_ListIdsConcs,Term) :- !,
  188    cgc(Id,situation,_,[GID],_),
  189    cg(GID,Rels,A,B),
  190    translate_cgraph(cg(GID,Rels,A,B),Term1),
  191    Term=..[~, Term1].
  192
  193construct_term(and,[Id1,Id2],_ListIdsConcs,Term) :- !,
  194    cgc(Id1,situation,_,[GID1],_),
  195    cg(GID1,Rels1,A1,B1),
  196    translate_cgraph(cg(GID1,Rels1,A1,B1),Term1),
  197    cgc(Id2,situation,_,[GID2],_),
  198    cg(GID2,Rels2,A2,B2),
  199    translate_cgraph(cg(GID2,Rels2,A2,B2),Term2),
  200    Term=..[&, Term1,Term2].
  201
  202construct_term(Rname,Ids,ListIdsConcs,Term) :- 
  203    length(Ids,1),
  204    Ids=[Id],
  205    cgc(Id,simple,Rname,Refs,_),
  206    member(fs(num,pl),Refs),
  207    member(Id-Var,ListIdsConcs),
  208    M=..[Rname,'X'],
  209    Term=(every('X',member('X',Var)->M)&set(Var)).
  210    
  211    
  212
  213construct_term(Rname,Ids,ListIdsConcs,Term) :- 
  214    length(Ids,N), functor(Term,Rname,N),
  215    insert_args(Term,Ids,ListIdsConcs,1).
  216
  217insert_args(Term,[Id|Next],ListIdsConcs,Num):- member(Id-Var,ListIdsConcs),
  218    arg(Num,Term,Var),Num1 is Num + 1,
  219    insert_args(Term,Next,ListIdsConcs,Num1).
  220
  221insert_args(Term,[Id|Next],ListIdsConcs,Num):- ind(Id,_Type,Ind),
  222    arg(Num,Term,Ind),Num1 is Num + 1,
  223    insert_args(Term,Next,ListIdsConcs,Num1).
  224
  225insert_args(Term,[Id|Next],ListIdsConcs,Num):- cgc(Id,situation,Dummy,_,_),
  226    arg(Num,Term,Dummy),Num1 is Num + 1,
  227    insert_args(Term,Next,ListIdsConcs,Num1).
  228
  229
  230insert_args(_Term,[],_,_).
  231
  232sing_every(Refs):-  ground(Refs), 
  233    member(fs(quant,every),Refs), 
  234    \+ member(fs(num,pl),Refs).
  235
  236
  237
  238make_string_f(F,S):-
  239    functor(F,Name,1),
  240    arg(1,F,Arg),
  241    make_string_f(Arg,S4),
  242    a_concat('(',S4,S5),
  243    a_concat(S5,')',S6),
  244    a_concat(Name,S6,S).
  245    
  246make_string_f(F,S):-
  247    functor(F,A,2),
  248    member(A,[&,'#','->']),!,
  249    arg(1,F,Arg),
  250    make_string_f(Arg,S4),
  251    a_concat(S4,' ',S5),
  252    a_concat(S5,A,S51),
  253    a_concat(S51,' ',S52),
  254    arg(2,F,Arg2),
  255    make_string_f(Arg2,S6),
  256    a_concat(S52,S6,S).
  257
  258make_string_f(F,S):-
  259    functor(F,Name,2),
  260    arg(1,F,Arg),
  261    make_string_f(Arg,S4),
  262    a_concat(S4,',',S5),
  263    arg(2,F,Arg2),
  264    make_string_f(Arg2,S6),
  265    a_concat(S5,S6,S7),
  266    a_concat('(',S7,S8),
  267    a_concat(S8,')',S9),
  268    a_concat(Name,S9,S).
  269
  270
  271make_string_f(F,F):- atom(F).
  272
  273
  274
  275
  276
  277translate_pred_id(Id,F):- check_fol_graph(Id),!,
  278    cg(Id,A,B,C),translate_cgraph(cg(Id,A,B,C),F1),
  279    make_string_f(F1,F).
  280
  281translate_pred_id(_Id,F):- F='This graph can not be translated to First Order Predicate Calculus'.
  282
  283check_fol_graph(Id):- cg(Id,A,_B,_C),member(Rel,A),Rel=cgr(Name,Args,_),
  284    member(Id1,Args),
  285    cgc(Id1,situation,_,_,_),
  286    \+(member(Name,[and,or,not])),!, fail.
  287
  288check_fol_graph(_).
  289
  290
  291:- fixup_exports.