#!/usr/bin/env swipl
% 
% Dec 13, 2034
% Douglas Miles
%  cls ; kill -9 %1 ; swipl -g "ensure_loaded(pack(logicmoo_base/t/sanity_base/clause_fwd_01c.pfc'))."

:- include(test_header).
% :- set_prolog_flag(lm_pfc_lean,true).
% :- use_module(library(pfc)).

:- kb_local(aa/2).

( aa(N):- _B ) ==> early_aa_H(N). 
( aa(N):- B ) ==> early_aa_HB(N,B). 
%TODO error ( H :- B ) ==> early_HB(H,B). 
( aa(N) ) ==> early_aa(N). 
( ~H :- B ) ==> early_not_HB(H,B).
( ~bb(H) :- B ) ==> early_not_bb_HB(H,B).
( ~bb(H) :- _B ) ==> early_not_bb_H(H).
%TODO performance ( P ) ==> early_p(P).
%TODO performance ( ~P ) ==> early_not_p(P).

aa(1):- writeln(1+1).
aa(2). 
aa(3):- true.
aa(N):- member(N,[4,5]).


% FWI, not assertable: gg(8):- _G.
gg(9):- call(_G).
gg(G):- G.
gg(G):- call(G).


~bb(1):- writeln(1+1).
~bb(2).
~bb(3):- true.
~bb(N):- member(N,[4,5]).

% FWI, not assertable:  ~ng(8):- _G.
~ng(9):- call(_G).
~ng(G):- G.
~ng(G):- call(G).



( aa(N):- _B ) ==> late_aa_H(N). 
( aa(N):- B ) ==> late_aa_HB(N,B). 
%TODO error ( H :- B ) ==> late_HB(H,B). 
( aa(N) ) ==> late_aa(N). 
( ~H :- B ) ==> late_not_HB(H,B).
( ~bb(H) :- B ) ==> late_not_bb_HB(H,B).
( ~bb(H) :- _B ) ==> late_not_bb_H(H).
%TODO performance ( P ) ==> late_p(P).
%TODO performance ( ~P ) ==> late_not_p(P).

:- mpred_test(early_aa(1)).
:- mpred_test(early_aa(2)).
:- mpred_test(early_aa(3)).
:- mpred_test(early_aa(4)).
:- mpred_test(early_aa(5)).

:- mpred_test(late_aa(1)).
:- mpred_test(late_aa(2)).
:- mpred_test(late_aa(3)).
:- mpred_test(late_aa(4)).
:- mpred_test(late_aa(5)).

:- mpred_test(late_aa_HB(A, member(A, [4, 5]))).
:- mpred_test(late_aa_HB(3, true)).
:- mpred_test(late_aa_HB(2, true)).
:- mpred_test(late_aa_HB(1, writeln(1+1))).
% :- mpred_test(late_aa_HB(A, inherit_above(user, aa(A)))).


:- mpred_test(early_aa_HB(A, member(A, [4, 5]))).
:- warn_fail_TODO(early_aa_HB(2, true)).
:- warn_fail_TODO(early_aa_HB(3, true)).
:- mpred_test(early_aa_HB(1, writeln(1+1))).
% :- mpred_test(early_aa_HB(A, inherit_above(user, aa(A)))).


:- warn_fail_TODO(late_aa_H(1)).
:- warn_fail_TODO(late_aa_H(2)).
:- warn_fail_TODO(late_aa_H(3)).
:- warn_fail_TODO(late_aa_H(_)).
:- mpred_test(clause_asserted(late_aa_H(_))).
:- warn_fail_TODO(\+ clause_asserted(late_aa_H(4))).
:- warn_fail_TODO(\+ clause_asserted(late_aa_H(5))).


:- warn_fail_TODO(early_aa_H(1)).
:- warn_fail_TODO(early_aa_H(2)).
:- warn_fail_TODO(early_aa_H(3)).
:- warn_fail_TODO(early_aa_H(_)).
:- mpred_test(clause_asserted(early_aa_H(_))).
:- warn_fail_TODO(\+ clause_asserted(early_aa_H(4))).
:- warn_fail_TODO(\+ clause_asserted(early_aa_H(5))).



:- listing([early_aa/1,late_aa/1]).

:- listing([early_aa_HB/2,late_aa_HB/2]).

:- listing([early_aa_H/1,late_aa_H/1]).


:- listing([early_not_bb_H/1,late_not_bb_H/1]).

:- listing([early_not_HB/2,late_not_HB/2]).

:- listing([early_not_bb_HB/2,late_not_bb_HB/2]).