
/*       KLONE2.PL        settembre  91    */

/* predicati usati dal top level */

 g_conc(X) :- generic_concept(X).
 diffs(A,B) :-
        work(C),
        net_arc(diffs,A,D,B,E,C).
 diffs(A,B) :-
        work(C),
        super_r(A,D,B,E),
        not mods(A,B).
 diffs(A,B,C,D) :-
        work(E),
        net_arc(diffs,A,B,C,D,E).
 diffs(A,B,C,D) :-
        work(E),
        super_r(A,B,C,D),
        not mods(A,B,C,D).
 super_c(A,B) :-
        work(C),
        net_arc(super_c,A,B,C).
 super_c(A,B) :-
        work(C),
        net_arc(super_c,A,D,C),
        D\==B,
        super_c(D,B).
 super_c(A,B) :-
        work(C),
        net_arc(vr_facet,D,E,A,C),
        net_arc(mods,D,E,F,G,C),
        net_arc(diffs,D,E,F,G,C),
        vr_facet(F,G,B).
 modality_facet(A,B,C) :-
        work(D),
        net_arc(modality_facet,A,B,C,D).
 modality_facet(A,B,opt) :-
        work(C),
        not net_arc(modality_facet,A,B,D,C),
        not (net_arc(mods,A,B,E,F,C);net_arc(diffs,A,B,E,F,C)).
 modality_facet(A,B,C) :-
        work(D),
        not net_arc(modality_facet,A,B,E,D),
        (
          net_arc(mods,A,B,F,G,D)
        ;
          net_arc(diffs,A,B,F,G,D)
        ),
        modality_facet(F,G,C),
        \+ (net_arc(mods,A,B,H,I,D);
            net_arc(diffs,A,B,H,I,D),H\==F,modality_facet(H,I,J),
            stronger_modality(J,C)).
 number_facet(A,B,[C,D]) :-
        work(E),
        net_arc(number_facet,A,B,[C,D],E).
 number_facet(A,B,[1,nil]) :-
        work(C),
        not net_arc(number_facet,A,B,D,C),
        \+ (net_arc(mods,A,B,E,F,C);net_arc(diffs,A,B,G,H,C)).
 number_facet(A,B,[C,D]) :-
        work(E),
        not net_arc(number_facet,A,B,F,E),
        not net_arc(diffs,A,B,G,H,E),
        net_arc(mods,A,B,I,J,E),
        number_facet(I,J,[C,K]),
        \+ (net_arc(mods,A,B,L,M,E),L\==I,number_facet(L,M,[N,O]),
                                          greater_than(N,C)),
        net_arc(mods,A,B,P,Q,E),
        number_facet(P,Q,[R,D]),
        \+ (net_arc(mods,A,B,S,T,E),U\==P,number_facet(S,T,[V,W]),
                                          less_than(W,D)).
 number_facet(A,B,[1,C]) :-
        work(D),
        not net_arc(number_facet,A,B,E,D),
        not net_arc(mods,A,B,F,G,D),
        net_arc(diffs,A,B,H,I,D),
        number_facet(H,I,[J,C]),
        \+ (net_arc(diffs,A,B,K,L,D),K\==H,number_facet(K,L,[M,N]),
            less_than(N,C)).
 number_facet(A,B,[C,D]) :-
        (
          work(E),
          not number_facet(A,B,[F,G]),
          net_arc(mods,A,B,H,I,E),
          number_facet(H,I,[C,J]),
          \+ (net_arc(mods,A,B,K,L,E),K\==H,number_facet(K,L,[M,N]),
             greater_than(M,C)),
          net_arc(mods,A,B,O,P,E)
        ;
          net_arc(diffs,A,B,O,P,E),
          number_facet(O,P,[Q,D]),
          \+ (net_arc(mods,A,B,R,S,E);net_arc(diffs,A,B,R,S,E),R\==O,
              number_facet(R,S,[T,U]),less_than(U,D))
        ).
 role(A,B) :-
        work(C),
        net_arc(role,A,B,C).
 role(A,B) :-
        work(C),
        net_arc(role,D,B,C),
        generic_role(B),
        super_c(A,D).
 role(A,B) :-
        work(C),
        net_arc(role,D,B,C),
        instance_role(B),
        (
          super_c(A,D)
        ;
          indiv_c(A,D)
        ).
 super_r(A,B) :-
        work(C),
        (
          net_arc(mods,A,D,B,E,C)
        ;
          net_arc(diffs,A,F,B,G,C)
        ).
 super_r(A,B) :-
        work(C),
        (
          net_arc(mods,A,D,E,F,C)
        ;
          net_arc(diffs,A,G,E,H,C)
        ),
        E\==B,
        super_r(E,B).
 super_r(A,B,C,D) :-
        work(E),
        (
          net_arc(mods,A,B,C,D,E)
        ;
          net_arc(diffs,A,B,C,D,E)
        ).
 super_r(A,B,C,D) :-
        work(E),
        (
          net_arc(mods,A,B,F,G,E)
        ;
          net_arc(diffs,A,B,F,G,E)
        ),
        (
          F\==C
        ;
          F==C,
          G\==D
        ),
        super_r(F,G,C,D).
 value_facet(A,B,C) :-
        work(D),
        net_arc(value_facet,A,B,C,D).
 vr_facet(A,B,C) :-
        work(D),
        net_arc(vr_facet,A,B,C,D).
 vr_facet(A,B,C) :-
        work(D),
        (
          net_arc(mods,A,B,E,F,D)
        ;
          net_arc(diffs,A,B,E,F,D)
        ),
        vr_facet(E,F,C).
 indiv_c(A,B) :-
        work(C),
        net_arc(indiv_c,A,B,C).
 indiv_c(A,B) :-
        work(C),
        net_arc(indiv_c,A,D,C),
        D\==B,
        super_c(D,B).
 mods(A,B) :-
        work(C),
        net_arc(mods,A,D,B,E,C).
 mods(A,B) :-
        work(C),
        net_arc(mods,A,D,E,F,C),
        E\==B,
        mods(E,B).
 mods(A,B,C,D) :-
        work(E),
        net_arc(mods,A,B,C,D,E).
 mods(A,B,C,D) :-
        work(E),
        net_arc(mods,A,B,F,G,E),
        F\==C,
        mods(F,G,C,D).
 sats(A,B) :-
        work(C),
        net_arc(sats,A,D,B,E,C).
 sats(A,B) :-
        work(C),
        net_arc(sats,A,D,E,F,C),
        E\==B,
        super_r(E,G,B,H).
 sats(A,B,C,D) :-
        work(E),
        net_arc(sats,A,B,C,D,E).
 sats(A,B,C,D) :-
        work(E),
        net_arc(sats,A,B,F,G,E),
        F\==C,
        super_r(F,G,C,D).
 formula_structure(A,B,C,D) :-
        nonvar(A),
        functor(A,B,C),
        A=..[B|D].
 defined_op(assume,generic_concept(A)).
 defined_op(assume,individual_concept(A)).
 defined_op(assume,generic_role(A,B)).
 defined_op(assume,instance_role(A,B)).
 defined_op(assume,has_super_concept(A,B)).
 defined_op(assume,individuates(A,B)).
 defined_op(assume,has_role(A,B)).
 defined_op(assume,modifies(A,B,C,D)).
 defined_op(assume,differentiates(A,B,C,D)).
 defined_op(assume,satisfies(A,B,C,D)).
 defined_op(assume,has_vr(A,B,C)).
 defined_op(assume,has_value(A,B,C)).
 defined_op(assume,has_modality(A,B,C)).
 defined_op(assume,has_number(A,B,C)).
 assert_data(A,B) :-
        pred_name(B,C),
        work(D),
        asserta(net_node(C,A,D)).
 assert_data(A,B,C) :-
        (
          C==has_super_concept
        ;
          (
            C==has_role
          ;
            C==individuates
          )
        ),
        pred_name(C,D),
        work(E),
        asserta(net_arc(D,A,B,E)).
 assert_data(A,B,C) :-
        (
          C==generic_role
        ;
          C==instance_role
        ),
        pred_name(C,D),
        work(E),
        asserta(net_node(D,A,B,E)).
 assert_data(A,B,C,D) :-
        pred_name(D,E),
        work(F),
        asserta(net_arc(E,A,B,C,F)).
 assert_data(A,B,C,D,E) :-
        pred_name(E,F),
        work(G),
        asserta(net_arc(F,A,B,C,D,G)).


 pred_name(generic_concept,g_conc).
 pred_name(individual_concept,i_conc).
 pred_name(generic_role,g_role).
 pred_name(instance_role,i_role).
 pred_name(has_super_concept,super_c).
 pred_name(individuates,indiv_c).
 pred_name(modifies,mods).
 pred_name(differentiates,diffs).
 pred_name(satisfies,sats).
 pred_name(has_role,role).
 pred_name(has_vr,vr_facet).
 pred_name(has_value,value_facet).
 pred_name(has_modality,modality_facet).
 pred_name(has_number,number_facet).
 is_consistent(A) :-
        not neg(A,B,C).
 neg(super_c(A,B),1,A) :-
        not g_conc(A).
 neg(super_c(A,B),1,B) :-
        not g_conc(B).
 neg(super_c(A,B),1,[A]) :-
        not net_node(g_conc,A,C).
 neg(super_c(A,B),1,[B]) :-
        not net_node(g_conc,B,C).
 neg(super_c(A,B),2,[A]) :-
        A==B.
 init(A) :-
        asserta(work(A)).
 stronger_modality(obl,ine).
 stronger_modality(obl,opt).
 stronger_modality(ine,opt).

 natnum(N) :- integer(N).
 greater_than(A,B) :-
        natnum(A),
        natnum(B),
        A\==nil,
        B\==nil,
        A>=B.
 greater_than(nil,A) :-
        natnum(A),
        A\==nil.
 less_than(A,B) :-
        natnum(A),
        natnum(B),
        A\==nil,
        B\==nil,
        A<B.
 less_than(A,nil) :-
        natnum(A),
        A\==nil.

