1:- module(common_logic_modalization,[qualify_nesc/2]). 2
3:- system:((
4 op(1199,fx,('==>')),
5 op(1190,xfx,('::::')),
6 op(1180,xfx,('==>')),
7 op(1170,xfx,'<==>'),
8 op(1160,xfx,('<-')),
9 op(1150,xfx,'=>'),
10 op(1140,xfx,'<='),
11 op(1130,xfx,'<=>'),
12 op(600,yfx,'&'),
13 op(600,yfx,'v'),
14 op(350,xfx,'xor'),
15 op(300,fx,'~'),
16 op(300,fx,'-'))). 17
18:- op(800,xfx,'=<>='). 19
38
39
40
41:- create_prolog_flag(logicmoo_modality,none,[keep(true)]). 42
43:- thread_local(t_l:qualify_modally/0).
45qualify_modality(OuterQuantKIF,OuterQuantKIF):- current_prolog_flag(logicmoo_modality,none),!.
46qualify_modality(PQ,PQO):- qualify_nesc(PQ,PQO).
57qualify_nesc(OuterQuantKIF,OuterQuantKIF):- var(OuterQuantKIF),!.
58qualify_nesc(IN,OUT):-is_list(IN),must_maplist_det(qualify_nesc,IN,OUT),!.
59qualify_nesc(OuterQuantKIF,OuterQuantKIF):- leave_as_is(OuterQuantKIF),!.
60qualify_nesc(OuterQuantKIF,OuterQuantKIF):- contains_modal(OuterQuantKIF),!.
61qualify_nesc(PQ,PQO):- PQ=..[F|Q],is_quantifier(F),append(LQ,[RQ],Q),qualify_nesc(RQ,RQQ),append(LQ,[RQQ],QQ),PQO=..[F|QQ],!.
63
65qualify_nesc(P,(poss(P)=>nesc(P))):- current_prolog_flag(logicmoo_modality,full), !.
66
68qualify_nesc(P,nesc(P)):- current_prolog_flag(logicmoo_modality,late), !.
69
70
72qualify_nesc( ~(IN), ~(poss(IN))):- current_prolog_flag(logicmoo_modality,part), !.
74qualify_nesc(P=>Q,((poss(Q)&nesc(P))=>nesc(Q))):- current_prolog_flag(logicmoo_modality,part), !.
77qualify_nesc(P,nesc(P)):- \+ current_prolog_flag(logicmoo_modality,full), !.
78
80qualify_nesc(P,nesc(P)):- !.
81
83qualify_nesc(P=>Q,(PP => (NP & QP =>NQ))):-!, weaken_to_poss(P,PP),weaken_to_poss(Q,QP),add_nesc(P,NP),add_nesc(Q,NQ).
84qualify_nesc((P & Q),(PossPQ => (P & Q))):- weaken_to_poss(P & Q, PossPQ),!.
85
101add_nesc(IN,OUT):-is_list(IN),must_maplist_det(add_nesc,IN,OUT),!.
102add_nesc(OuterQuantKIF,OuterQuantKIF):- is_ftVar(OuterQuantKIF),!.
103add_nesc(OuterQuantKIF,OuterQuantKIF):-leave_as_is(OuterQuantKIF),!.
104add_nesc(OuterQuantKIF,OuterQuantKIF):-contains_modal(OuterQuantKIF),!.
105add_nesc( ~(IN), nesc(~(IN))).
106add_nesc(IN,OUT):-IN=..[F|INL],logical_functor_pttp(F),!,must_maplist_det(add_nesc,INL,OUTL),OUT=..[F|OUTL].
107add_nesc(IN,nesc(IN)).
127add_poss_to([],Wff6667, Wff6667).
128add_poss_to([PreCond|S],Wff6667, PreCondPOS):-!,
129 add_poss_to(PreCond,Wff6667, PreCondM),
130 add_poss_to(S,PreCondM, PreCondPOS).
131
132add_poss_to(PreCond,Wff6667, PreCond=>Wff6667):-prequent(PreCond).
133add_poss_to(PreCond,Wff6667, Wff6667):-leave_as_is_logically(PreCond).
134add_poss_to( ~(_PreCond),Wff6667, Wff6667).
135add_poss_to(PreCond,Wff6667, (poss(PreCond)=>Wff6667)).
136
137
147weaken_to_poss(PQ,poss(PQ)):- var(PQ),!.
148weaken_to_poss(poss(PQ),poss(PQ)):-!.
149weaken_to_poss(nesc(PQ),poss(PQ)):-!.
150weaken_to_poss(INL,OUTC):-is_list(INL),must_maplist_det(weaken_to_poss,INL,OUTL),
151 F='&',OUT=..[F|OUTL],correct_arities(F,OUT,OUTC).
153weaken_to_poss(OuterQuantKIF,poss(OuterQuantKIF)):- leave_as_is_logically(OuterQuantKIF),!.
154weaken_to_poss( ~(IN), poss(~(IN))):-!.
155weaken_to_poss(IN,OUT):-IN=..[F|INL],logical_functor_pttp(F),!,must_maplist_det(weaken_to_poss,INL,OUTL),OUT=..[F|OUTL].
156weaken_to_poss(IN,poss(IN)).
157
158
162
163
164
165
166
167
168
169
170
171
172
173identical_refl(X,Y):- =<>=(X,Y),!.
174
175
176
177
178
179undess_head(H,H):- current_prolog_flag(logicmoo_propagation, modal),!.
180
181undess_head((H:-B),(HH:-B)):-!,undess_head(H,HH).
182undess_head(proven_nesc(H),H):- !.
183undess_head(H,H).
184
185
186demodal_clauses(_KB,Var, Var):- \+compound(Var),!.
187demodal_clauses(KB,(Head:-Body),HeadOBodyO):- !, demodal_head_body(KB,Head,Body,HeadOBodyO),!.
188demodal_clauses(KB,List, ListO):- is_list(List), !,
189 must_maplist_det(demodal_clauses(KB),List,ListM),!,
190 kif_optionally_e(true,remove_unused_clauses,ListM,ListOM),
191 kif_optionally_e(true,dedupe_clauses,ListOM,ListO).
192demodal_clauses(KB,Head,HeadOBodyO):- demodal_head_body(KB,Head,true,HeadOBodyO),!.
193
194
206
207
208demodal_head_body(KB,Head,Body,HeadBodyO):-
209 demodal_head(KB,Head,HeadM,Body,HeadExtra),
210 (HeadM \== Head ; HeadExtra \== true),!, conjoin(HeadExtra,Body,BodyM),
211 demodal_head_body1(KB,HeadM,BodyM,HeadBodyO),!.
212
213demodal_head_body(KB,Head,Body,OUT):- demodal_head_body1(KB,Head,Body,OUT).
214
215proven_negated_lit(_,_):-!,fail.
216proven_negated_lit(C,proven_neg(Head)):- same_compound(C,proven_tru(Head)).
217proven_negated_lit(C,proven_tru(Head)):- same_compound(C,proven_neg(Head)).
218
219demodal_head_body1(_KB,'$unused'(Head),Body,('$unused'(Head):-Body)):-!.
220demodal_head_body1(_KB,Head,Body,('$unused'(Head):-Body)):- Body = fail_cause(_,_),!.
221
222demodal_head_body1(KB, (NEG_Head),
223 ( falsify(SKOLEM3)),Out):- same_compound(SKOLEM3,skolem(_,_)),proven_negated_lit(NEG_Head,POS_Head),
224 demodal_head_body(KB, (POS_Head),
225 ( (SKOLEM3)),Out).
226
227demodal_head_body1(KB, (NEG_Head),
228 ( falsify(SKOLEM3), B),Out):- same_compound(SKOLEM3,skolem(_,_)),proven_negated_lit(NEG_Head,POS_Head),
229 demodal_head_body(KB, (POS_Head),
230 ( (SKOLEM3) , B),Out).
231
232demodal_head_body1(KB, (NEG_Head),
233 (A, falsify(SKOLEM3)),Out):- same_compound(SKOLEM3,skolem(_,_)),proven_negated_lit(NEG_Head,POS_Head),
234 demodal_head_body(KB, (POS_Head),
235 (A, (SKOLEM3)),Out).
236
237demodal_head_body1(KB, (NEG_Head),
238 (A, falsify(SKOLEM3), B),Out):- same_compound(SKOLEM3,skolem(_,_)),proven_negated_lit(NEG_Head,POS_Head),
239 demodal_head_body(KB, (POS_Head),
240 (A, (SKOLEM3) , B),Out).
241
242
243demodal_head_body1(_KB,Head,Body,('$unused'(Head):-fail_cause(unusable_body,Body))):-
244 unusable_body(Head,Body),!.
245demodal_head_body1(KB,Head,Body,OUT):-
246 demodal_body(KB,Head,Body,Body1),
247 demodal_body(KB,Head,Body1,BodyM),
248 (Body=@=BodyM -> OUT= (Head :- Body) ;
249 demodal_head_body1(KB,Head,BodyM,OUT)),!.
250
251
252unusable_body(_,Var):- \+ compound(Var),!,fail.
253unusable_body(_,fail_cause(_,_)).
254unusable_body(_,fail_cause(_)).
255unusable_body(_,(proven_not_reify(XX),_)):- !,nonvar(XX).
256unusable_body(_,(A,B,_)):- negations_of_each_other(A,B).
257unusable_body(Head,(A,B)):- !,(unusable_body(Head,A);unusable_body(Head,B)).
258unusable_body(Head,(A;B)):- !,(unusable_body(Head,A);unusable_body(Head,B)).
259unusable_body(_,\+ needs(_)).
260unusable_body(_,fail).
261unusable_body(_,falsify(skolem(_,_))).
262
264
265negations_of_each_other(A,B):- A =<>= ~B.
266negations_of_each_other(A,B):- ~A =<>= B.
267
268
269guess_varnames(IO):-guess_varnames(IO,_).
270guess_varnames(I,O):-guess_varnames(add_var_to_env,I,O).
271
272:- meta_predicate guess_varnames(2,*,*). 273guess_varnames(_Each,G,G):- \+ compound(G),!.
274guess_varnames(Each, subrelation(V,N), subrelation(V,N)):- var(V), \+ variable_name(V,_), atomic(N),call(Each,N,V),!.
275guess_varnames(Each, isNamed(V,N), isNamed(V,N)):- var(V), \+ variable_name(V,_), atomic(N),call(Each,N,V),!.
276guess_varnames(Each, isNamed(V,H), isNamed(V,H)):- var(V), \+ variable_name(V,_),
277 compound(H),functor(H,F,_),
278 flag(skolem_count,SKN,SKN+1),
279 toCamelcase(F,UF),atom_concat(UF,SKN,UF1),
280 call(Each,UF1,V),!.
281guess_varnames(Each,H,H ):- H=..[F,V],var(V),
282 \+ variable_name(V,_),
283 \+ atom_concat('sk',_,F),
284 \+ atom_concat(_,'Of',F),
285 \+ atom_concat(_,'Fn',F),
286 flag(skolem_count,SKN,SKN+1),
287 toCamelcase(F,UF),atom_concat(UF,SKN,UF1),
288 call(Each,UF1,V),!.
289guess_varnames(Each,H,HH ):- H=..[F|ARGS],!,must_maplist_det(guess_varnames(Each),ARGS,ARGSO),!,HH=..[F|ARGSO].
290guess_varnames(_Each, (G), (G)):- !.
291
320body_contains(B,Cont):- notrace((compound(Cont),compound(SK),sub_term(SK,B),compound(SK),SK=Cont)),!.
321
322
325
326demodal_head(_KB,proven_nesc(skolem(X,Y)),make_existential(X,Y),_Body,true).
327demodal_head(_KB,proven_tru(nesc(~FALSE)),proven_neg(FALSE),_Body,true):- nonvar(FALSE).
328demodal_head(_KB,proven_neg(DIFF),proven_helper(equals(X,Y)),_Body,true):- same_compound(DIFF,different(X, Y)), !.
329demodal_head(_KB,proven_neg(DIFF),proven_helper(dif_objs(X,Y)),_Body,true):- same_compound(DIFF,equals(X, Y)), !.
330
331demodal_head(_KB,proven_neg(skolem(X,Y)),('$unused'(make_existential(was_create_min,X,Y))),_Body,true):- functor(Y,skF,_).
332demodal_head(_KB,proven_neg(skolem(X,if_all_different(A,B,C))),(make_existential(X,skF(A,B,X,C))),_Body,true).
333demodal_head(_KB,proven_tru(H),deduce_tru(H),Body,true):- body_contains(Body,skolem(_,_)).
334demodal_head(_KB,proven_neg(H),deduce_neg(H),Body,true):- body_contains(Body,skolem(_,_)).
335demodal_head(KB,proven_nesc(H),proven_tru(HH),_Body,Out):- demodal_any(KB,H,HH,Out),!.
336demodal_head(KB,proven_nesc(H),proven_nesc(HH),_Body,Out):- demodal_any(KB,H,HH,Out),!.
337demodal_head(KB,proven_neg(H),proven_neg(HH),_Body,Out):- demodal_any(KB,H,HH,Out),!.
338
339demodal_head(KB,Head,HeadM,_Body,HeadExtra):- demodal_any(KB,Head,HeadM,HeadExtra).
340
341
342sharing_vars_vars(A,B):- term_variables(A,AV),term_variables(B,BV),member(VB,BV),member(VA,AV),VB =<>= VA.
343same_compound(COMP,SAME):- compound(COMP),compound(SAME),COMP=@=SAME.
344
345
347
348demodal_any(_KB,P,P,true):- \+ compound(P),!.
349demodal_any(_KB,P,P,true):- P=..[_,A],\+ compound(A),!.
350
351demodal_any(_KB,proven_not_nesc(different(A,B)),proven_nesc(equals(A,B)),true):-!.
352demodal_any(_KB,proven_not_nesc(equals(A,B)),proven_nesc(different(A,B)),true):-!.
353demodal_any(_KB,proven_not_nesc(mudEquals(A,B)), proven_nesc(different(A,B)),true):-!.
354demodal_any(_KB, not_nesc(b_d(_7B2, nesc, poss), A v ~B), (~A & B),true) :-!.
355demodal_any(_KB,proven_not_nesc(isa(A,B)),not_isa(A,B),true):- nonvar(B),!.
356demodal_any(_KB,naf(proven_not_nesc(Head)),poss(Head),true):- !.
357demodal_any(KB,nesc(_,Head),NHead,Out):- !,demodal_any(KB,nesc(Head),NHead,Out).
358demodal_any(KB,poss(_,Head),NHead,Out):- !,demodal_any(KB,poss(Head),NHead,Out).
359
360demodal_any(KB,falsify(nesc(~P)),poss(PP),Out):-!,demodal_any(KB,P,PP,Out).
361demodal_any(KB,nesc(G),PP,Out):- same_compound(G,nesc(P)),!,demodal_any(KB,nesc(P),PP,Out).
362demodal_any(KB,poss(G),PP,Out):- same_compound(G,poss(P)),!,demodal_any(KB,poss(P),PP,Out).
363demodal_any(KB,H,HH,Out):- H=..[F,A],demodal_any(KB,A,AA,Out),HH=..[F,AA].
364demodal_any(_KB,Head,Head,true):- !.
366
367
368is_xformed_body(ensure_cond).
369is_xformed_body(never_cond).
370is_xformed_body(skolem).
371
372demodal_body(_KB,_Head,Var, Var):- \+compound(Var),!.
373demodal_body(_KB,_Head, skolem(X,if_all_different(N,SkF,DFml)), not_in(X,skF(N,SkF,X,DFml))):-!.
374demodal_body(_KB,_Head,Var, Var):- functor(Var,F,_),is_xformed_body(F),!.
375
376demodal_body(KB, Head, Body,BodyO):- demodal_any(KB,Body,BodyM,Conj), (BodyM \== Body;Conj \== true),
377 conjoin(Conj,BodyM,BodyMM),!,
378 demodal_body(KB, Head, BodyMM,BodyO).
379
381
383
384demodal_body(KB, Head, (Var, Rest), NEW):- var(Var),!,demodal_body(KB, Head, Rest, NewRest),conjoin(NewRest,Var,NEW).
385demodal_body(_KB,_Head, poss(b_d(_7B2, nesc, poss),G), poss(G)).
386demodal_body(_KB,_Head, nesc(b_d(_7B2, nesc, poss),G), nesc(G)).
387
388demodal_body(_KB, _Head, (A ; B) , ensure_cond(G,either(CA,CB))):- same_compound(A,ensure_cond(G,CA)),same_compound(B,ensure_cond(G1,CB)),G==G1,!.
389
390demodal_body(_KB, _Head, ((A , B) ; C) , ({ignore(A)}, C) ):- identical_refl(B,C),!.
391demodal_body(_KB, _Head, (C ; (A , B) ) , ({ignore(A)}, C) ):- identical_refl(B,C),!.
392
393demodal_body(_KB, (Head), ensure_cond(_G, different(X, Y)),dif_objs(X,Y)):- compound(Head),member(XorY,[X,Y]),\+ contains_var(XorY,Head).
394demodal_body(_KB, (_Head), ensure_cond(_G, different(X, Y)),dif_objs(X,Y)):- !.
395
396
397
398demodal_body(_KB, _Head,(dif_objs(X, Y),nesc(PRED)),(nesc(PRED)*->dif_objs(X, Y))):- compound(PRED),member(XorY,[X,Y]),contains_var(XorY,PRED).
399
400demodal_body(_KB, _Head, (A ; C), A ):- identical_refl(A,C),!.
401
402
403demodal_body(_KB, _Head, (A , C), A ):- identical_refl(A,C),!.
404demodal_body(_KB, _Head, neg(nesc(~(P))), nesc(poss(P)) ):-!.
405demodal_body(_KB, proven_neg(_Head),(Body),fail_cause(naf_sk,Body)):-
406 Body = (falsify(skolem(_X,Y,_Z)),falsify(CALL)),
407 compound(CALL),compound(Y),!.
408
409demodal_body(_KB, (_Head),
410 ( falsify(skolem(X, Y)),
411 nesc(PRED1)
412 ; skolem(X, Y),
413 falsify(PRED2)
414 ),falsify(PRED2)):- PRED2 == PRED1,!.
415
416demodal_body(_KB, (_Head),
417 ( falsify(skolem(X, Y)),
418 _
419 ; skolem(X, Y),
420 PRED2
421 ),PRED2):- !.
422
423
424demodal_body(KB, Head, ((A0 , A1) ; (B0 , B1)), OUT):- A0 =<>= B0,!, demodal_body(KB, Head, (A1 ; B1), MID),
425 demodal_body(KB, Head, (A0 , MID), OUT).
426
427demodal_body(KB, Head, ((A0 , A1) ; (B0 , B1)), OUT):- A1 =<>= B1,!, demodal_body(KB, Head, (A0 ; B0), MID),
428 demodal_body(KB, Head, (MID , B1), OUT).
429
430
431demodal_body(KB, Head, (A ; B), OUT):- fail, demodal_body(KB, Head, A, AA),demodal_body(KB, Head, B, BB),
432 (A ; B) \== (AA ; BB),!, demodal_body(KB, Head, (AA ; BB), OUT).
433
434
435demodal_body(_KB, _Head, ((A , B) , C), (A , B , C)):- nonvar(A),!.
436demodal_body(_KB, _Head, (A , B , C), (A , B)):- identical_refl(A,C),!.
437demodal_body(_KB, _Head, (A , B , C), (A , C)):- identical_refl(A,B),!.
438demodal_body(_KB, _Head, (A , B , C), (A , C)):- identical_refl(C,B),!.
439
440
441demodal_body(_KB,_Head, poss(poss( G)), poss(G)):- nonvar(G),!.
442
443demodal_body(KB, Head, proven_not_neg(skolem(X,Y)), OUT):- !, demodal_body(KB, Head, (skolem(X,Y)), OUT).
444
445demodal_body(_KB, (make_existential(X,_)), proven_not_neg(G), ensure_cond(X,G)):- !.
446demodal_body(_KB, (make_existential(X,_)), proven_not_nesc(G), never_cond(X,G)):- !.
447
448demodal_body(KB,make_existential(X,SK), ((never_cond(XX, P); Q )), (ensure_cond(XX,P),QQ)):-
449 demodal_body(KB,make_existential(X,SK), Q,QQ),!.
450
459
460demodal_body(_KB,_Head,nesc(different(X,Y)),dif_objs(X,Y)):- !.
461demodal_body(_KB,_Head,neg(different(X,Y)),sameObjects(X,Y)):- !.
462demodal_body(_KB,_Head,nesc(different(X,Y)),dif_objs(XX,YY)):- (X @> Y -> XX/YY=X/Y ; XX/YY=Y/X).
463demodal_body(_KB,_Head,neg(different(X,Y)),sameObjects(XX,YY)):- (X @> Y -> XX/YY=X/Y ; XX/YY=Y/X).
464
465
466
467demodal_body(_KB,_Head,(H,T),(T,H)) :- \+ poss_or_skolem(H),poss_or_skolem(T).
468
469demodal_body(KB,Head,(A;B),BodyOut):- disjuncts_to_list((A;B),List),list_to_set(List,SET),List \== SET,!,must_maplist_det(demodal_body(KB,Head),SET,SET2),list_to_conjuncts((;),SET2,BodyOut).
470demodal_body(KB,Head,(A,B),BodyOut):- conjuncts_to_list_det((A,B),List),list_to_set(List,SET),List \== SET,!,must_maplist_det(demodal_body(KB,Head),SET,SET2),list_to_conjuncts(SET2,BodyOut).
471
472demodal_body(KB,Head,[H|T],[HH|TT]):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
473demodal_body(KB,Head,(H;T),(HH;TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
474
475
479
480demodal_body(_KB, _ , Body , fail_cause(naf_sk,Body)) :- body_contains(Body,never_any(skolem(_,_))).
481demodal_body(_KB, _ , Body , fail_cause(naf_sk,Body)) :- body_contains(Body,never_cond(_,skolem(_,_))).
482demodal_body(_KB, _ , Body , fail_cause(naf_sk,Body)) :- body_contains(Body,neg(skolem(_,_))).
483demodal_body(_KB, _ , Body , fail_cause(naf_sk,Body)) :- body_contains(Body,never_deduce(skolem(_,_))).
485
486demodal_body(_KB, _, neg(nesc(~P)),poss(P)):-!.
487
488demodal_body(_KB, pro_tru(_Head), proven_not_neg(X), nesc(X)):-!.
489demodal_body(_KB, pro_tru(_Head), proven_not_nesc(X), neg(X)):-!.
490
491demodal_body(_KB, con_neg(_Head), proven_not_neg(X), nesc(X)):-!.
492demodal_body(_KB, con_neg(_Head), proven_not_nesc(X), neg(X)):-!.
493
494
495demodal_body(_KB, (_Head), proven_not_neg(X), nesc(X)):-!.
496demodal_body(_KB, (_Head), proven_not_nesc(X), falsify(X)):-!.
497
498demodal_body(KB,Head,(H,T),(HH,TT)):- T\=(_,_),!, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
499demodal_body(KB,Head,(H,T),(HH,TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
500
501
502demodal_body(KB,Head,H,HH ):- H=..[F|ARGS],!,must_maplist_det(demodal_body(KB,Head),ARGS,ARGSO),!,HH=..[F|ARGSO].
503demodal_body(_KB,_Head, (G), (G)):- !.
504
505
506:- if(false). 507demodal_body(_KB, _Head, ((A , B) ; (C , D)), (A , (B ; D))):- identical_refl(A,C),!.
508demodal_body(_KB, _Head, proven_nesc(X), X).
509demodal_body(_KB, _Head, proven_neg(X), ~ X).
511demodal_body(_KB, proven_neg(_Head), \+ ~ CMP, true):- compound(CMP),CMP=(skolem(_,_)).
514demodal_body(_KB, proven_neg(Head), (Other,(\+ BHead ; ~Other1)),naf(BHead)):- BHead =<>= Head,Other=Other1.
515demodal_body(_KB, proven_neg(Head), (Other,( ~Other1 ; \+ BHead )),naf(BHead)):- BHead =<>= Head,Other=Other1.
516demodal_body(_KB, _Head, (A, proven_isa(I, C)), (proven_isa(I, C), A)):- A \= proven_isa(_, _).
518demodal_body(_KB,_Head,naf(~(CMP)),CMP):- poss_or_skolem(CMP).
519demodal_body(_KB,Head, v(A, ~(B)), ~(B)):- A =<>= Head,!.
520demodal_body(_KB,Head, v(~(B), A), ~(B)):- A =<>= Head,!.
521demodal_body(_KB,Head, v(A, B), B):- A =<>= Head,!.
522demodal_body(_KB,Head, v(B, A), B):- A =<>= Head,!.
523demodal_body(_KB, _Head, poss(A & B), (poss(A) , poss(B))):-nonvar(A),!.
526demodal_body(KB,Head,(H & T),(HH,TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
527demodal_body(KB,Head,(H,T),(HH,TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
528demodal_body(KB,Head,(H v T),(HH v TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
530demodal_body(_KB, Head, G, true):- G =<>= Head, unusual_body,!.
532demodal_body(_KB,_Head, naf(~(G)), poss(G)):- nonvar(G),!.
533demodal_body(_KB,_Head, ~(~(G)), (G)):- nonvar(G), unusual_body,!.
534demodal_body(_KB, _Head, not_nesc(b_d(_KB2, nesc, poss), A v ~B), (~A , B)) :-!.
535demodal_body(KB,Head, v(~(A), B), BB):- demodal_body(KB,Head,A,AA),AA =<>= Head,!,demodal_body(KB,Head,B,BB).
537demodal_body(KB,Head, v(~(A), B), (AA *-> BB)):- nonvar(A),!,demodal_body(KB,Head,A,AA),demodal_body(KB,Head,B,BB).
539demodal_body(_KB,_Head, \+ (~(G)), poss(G)):- nonvar(G),!.
540demodal_body(_KB, _Head, ( H, poss(G) ) , poss(G)):- H =<>= G , unusual_body.
541demodal_body(_KB, _Head, ( H, (G) ) , (G)):- H =<>= G, unusual_body.
542demodal_body(_KB, _Head, ( H, G ) , G):- H =<>= true, unusual_body.
543demodal_body(_KB, _Head, ( G, H ) , G):- H =<>= true, unusual_body.
544demodal_body(_KB, _Head, ( G *-> H ) , G):- H =<>= true, unusual_body.
545demodal_body(_KB, _Head, ( H *-> G ) , G):- H =<>= true, unusual_body.
550demodal_body(_KB,_Head, poss(poss( G)), poss(G)):- nonvar(G),!.
551demodal_body(KB,Head,[H|T],[HH|TT]):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
552demodal_body(KB,Head,(H;T),(HH;TT)):- !, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
553demodal_body(KB,Head,(H,T),(HH,TT)):- current_prolog_flag(logicmoo_propagation, modal),
554 T\=(_,_),!, must(( demodal_body(KB,Head,H,HH),demodal_body(KB,Head,T,TT))),!.
556demodal_body(KB,Head,H,HH ):- H=..[F|ARGS],!,must_maplist_det(demodal_body(KB,Head),ARGS,ARGSO),!,HH=..[F|ARGSO].
557:- endif. 558
559
560
561
562
563
564:- fixup_exports.