

:- module(kbii,[]).

:- include(test_header).

:- set_prolog_flag(retry_undefined,false).



%:- ensure_abox(kbii).
:- set_fileAssertMt(kbii).


% :- process_this_script.


:- set_prolog_flag(os_argv,[swipl, '-f', '/dev/null','--nonet']).

:- set_kif_option(+assert).


:- cls.      

% ============================================================
% all rooms have a door
% ============================================================
:- test_boxlog([+assert],all(R,exists(D,implies(room(R),and(door(D),has(R,D)))))).

% Should be simular in meaning to
% 
% door(D) :-
%       room(R),
%       skolem(D, skIsDoorInUnkArg2ofHas_1Fn(R)).
% ~room(R) :-
%       \+ ( 
%            door(D)
%          ).
% ~room(R) :-
%       \+ ( 
%            has(R, D)
%          ).
% has(R, D) :-
%       room(R),
%       skolem(D, skIsDoorInUnkArg2ofHas_1Fn(R)).


:- test_boxlog([+assert],all(D,implies(door(D),exists(K,and(knob(K),has(D,K)))))).

% ============================================================
% 1 room called room222 
% ============================================================
:- test_boxlog([+assert,+existentialize_objs],room(r111)).

room(r222).

:- test_boxlog([+assert],exactly(4,X,room(X))).

:- test_boxlog([+assert],room(r333)).

:- test_boxlog([+assert,+exist],room(r444)).


end_of_file.


% ============================================================
% joe knows  all rooms have a door
% ============================================================
:- test_boxlog(knows(joe,all(R,implies(room(R),exists(D,and(door(D),has(R,D)))))))  .

% Should be simular in meaning to
% ~knows(joe, room(A)) :-
%      \+ ( 
%           knows(joe, door(B))
%         ).
% ~knows(joe, room(A)) :-
%      \+ ( 
%           knows(joe, has(A, B))
%         ).
% knows(joe, door(A)) :-
%      knows(joe, room(B)),
%      skolem(A, skIsDoorInUnkArg2ofHas_2Fn(B)).
% knows(joe, has(A, B)) :-
%      knows(joe, room(A)),
%      skolem(B, skIsDoorInUnkArg2ofHas_2Fn(A)).

% ============================================================
% for all rooms joe knows about he belives a door exists
% ============================================================
:- test_boxlog(all(R,implies(knows(joe,room(R)),belives(joe,exists(D,and(door(D),has(R,D))))))).

% ~knows(joe, room(A)) :-
%      \+ ( 
%           belives(joe, door(B))
%         ).
% ~knows(joe, room(A)) :-
%      \+ ( 
%           belives(joe, has(A, B))
%         ).
% belives(joe, door(A)) :-
%      knows(joe, room(B)),
%      skolem(A, skIsDoorInUnkArg2ofHas_3Fn(B)).
% belives(joe, has(A, B)) :-
%      knows(joe, room(A)),
%      skolem(B, skIsDoorInUnkArg2ofHas_3Fn(A)).



% ============================================================
% For joe to eat the food it must be possible that the food is food and joe can eat it
% ============================================================
:- test_boxlog(poss(&(eats(joe,X),food(X)))=>(eats(joe,X),food(X))).

% eats(joe,X) :-
%       \+ ~eats(joe,X),
%       \+ ~food(X).
% food(X) :-
%       \+ ~eats(joe,X),
%       \+ ~food(X).

% ============================================================================================
% At least one man exists
% ============================================================================================

:- test_boxlog(atleast(1,X,man(X))).

% ============================================================================================
% At least three men exist
% ============================================================================================

:- test_boxlog(atleast(3,X,man(X))).

% ============================================================================================
% Organized Groups of prolog programmers have prolog programmers as members
% ============================================================================================

:- test_boxlog(implies(and(instance(M,tGroupedPrologOrganization),hasMembers(M,A)), instance(A,tClazzPrologPerson))).


/*
~hasMembers(_11164,_11142):- \+ (instance(_11164,tGroupedPrologOrganization),instance(_11142,tClazzPrologPerson)).
~instance(_11540,tGroupedPrologOrganization):- \+ (hasMembers(_11540,_11518),instance(_11518,tClazzPrologPerson)).
instance(_11874,tClazzPrologPerson):-instance(_11896,tGroupedPrologOrganization),hasMembers(_11896,_11874).
*/ 

% ============================================================================================
%  Those competeing in watersports may not wear shoes
% ============================================================================================
:- test_boxlog( =>(instance(ATH,tAgent),implies(and(instance(COMP,actAquaticSportsEvent),
competingAgents(COMP,ATH)),holdsIn(COMP,all(CLOTHING,not(and(instance(CLOTHING,tObjectShoe),wearsClothing(ATH,CLOTHING)))))))).
/*
~competingAgents(_20514,_20492):- ~holdsIn(_20514,v(~instance(_20470,tObjectShoe),~wearsClothing(_20492,_20470))),instance(_20514,actAquaticSportsEvent),instance(_20492,tAgent)
~instance(_20902,tAgent):- ~holdsIn(_20858,v(~instance(_20880,tObjectShoe),~wearsClothing(_20902,_20880))),instance(_20858,actAquaticSportsEvent),competingAgents(_20858,_20902)
~instance(_21272,actAquaticSportsEvent):- ~holdsIn(_21272,v(~instance(_21250,tObjectShoe),~wearsClothing(_21228,_21250))),competingAgents(_21272,_21228),instance(_21228,tAgent)
holdsIn(_21612,v(~instance(_21634,tObjectShoe),~wearsClothing(_21590,_21634))):-instance(_21612,actAquaticSportsEvent),competingAgents(_21612,_21590),instance(_21590,tAgent)
*/
% ~occuring(COMP) :-
%       instance(ATH, tAgent),
%       instance(COMP, actAquaticSportsEvent),
%       competingAgents(COMP, ATH),
%       instance(CLOTHING, tObjectShoe),
%       wearsClothing(ATH, CLOTHING).
% ~competingAgents(COMP, ATH) :-
%       instance(ATH, tAgent),
%       instance(COMP, actAquaticSportsEvent),
%       occuring(COMP),
%       instance(CLOTHING, tObjectShoe),
%       wearsClothing(ATH, CLOTHING).
% ~instance(CLOTHING, tObjectShoe) :-
%       instance(ATH, tAgent),
%       instance(COMP, actAquaticSportsEvent),
%       competingAgents(COMP, ATH),
%       occuring(COMP),
%       wearsClothing(ATH, CLOTHING).
% ~instance(COMP, actAquaticSportsEvent) :-
%       instance(ATH, tAgent),
%       competingAgents(COMP, ATH),
%       occuring(COMP),
%       instance(CLOTHING, tObjectShoe),
%       wearsClothing(ATH, CLOTHING).
% ~instance(ATH, tAgent) :-
%       instance(COMP, actAquaticSportsEvent),
%       competingAgents(COMP, ATH),
%       occuring(COMP),
%       instance(CLOTHING, tObjectShoe),
%       wearsClothing(ATH, CLOTHING).
% ~wearsClothing(ATH, CLOTHING) :-
%       instance(ATH, tAgent),
%       instance(COMP, actAquaticSportsEvent),
%       competingAgents(COMP, ATH),
%       occuring(COMP),
%       instance(CLOTHING, tObjectShoe).

% ================================================================================================================
%  When sightgseeing is occuring .. there is a tourist present
% ================================================================================================================
:- test_boxlog(implies(and(instance(Act,actSightseeing),performedBy(Person,Act)),holdsIn(Act,instance(Person,mobTourist)))).

/* OLD
~instance(_11704,actSightseeing):- \+ (performedBy(_11704,_11682),holdsIn(_11704,instance(_11682,mobTourist)))
~performedBy(_12092,_12070):- \+ (instance(_12092,actSightseeing),holdsIn(_12092,instance(_12070,mobTourist)))
holdsIn(_12442,instance(_12420,mobTourist)):-instance(_12442,actSightseeing),performedBy(_12442,_12420)

*/
% ~occuring(Act) :-
%       \+ ( instance(Act, actSightseeing),
%            naf(~performedBy(Person, Act)),
%            instance(Y, mobTourist)
%          ).
% ~instance(Act, actSightseeing) :-
%       \+ ( performedBy(Person, Act),
%            naf(~occuring(Act)),
%            instance(Y, mobTourist)
%          ).
% ~performedBy(Person, Act) :-
%       \+ ( instance(Act, actSightseeing),
%            naf(~occuring(Act)),
%            instance(Y, mobTourist)
%          ).
% instance(Y, mobTourist) :-
%       instance(Act, actSightseeing),
%       performedBy(Person, Act),
%       occuring(Act).


% ================================================================================================================
%  All rooms have a door (Odd syntax issue)
% ================================================================================================================

:- test_boxlog(all(R,room(R) => exists(D, and([door(D) , has(R,D)])))).

% door(D) :-
%       room(R),
%       skolem(D, skIsDoorInUnkArg2ofHas_2Fn(R)),
%       \+ ~has(R, D).
% ~room(R) :-
%       \+ ( has(R, D),
%            door(D)
%          ).
% has(R, D) :-
%       room(R),
%       skolem(D, skIsDoorInUnkArg2ofHas_2Fn(R)),
%       \+ ~door(D).




% ================================================================================================================
%  No one whom pays taxes in North america can be a dependant of another in the same year
% ================================================================================================================
:- set_prolog_flag(runtime_breaks,3).

:- test_boxlog([-ensure,-sort],
  or(
   holdsIn(YEAR, instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica))),
   holdsIn(YEAR, instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada))), 
   holdsIn(YEAR, instance(PERSON, nartR(mobTaxResidentsFn, iMexico))), 
   holdsIn(YEAR, instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica))), 
   forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, _SUPPORTEE)))).


% ~occuring(YEAR) :-
%       ~instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)),
%       \+ ( ( forbiddenToDoWrt(iCW_USIncomeTax,
%                               SUPPORTER,
%                               claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)),
%              instance(PERSON,
%                  nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica))
%            ),
%            instance(PERSON, nartR(mobTaxResidentsFn, iMexico))
%          ).
% instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica)) :-
%       occuring(YEAR),
%       ~instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iMexico)),
%       \+ ~forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)).
% instance(PERSON, nartR(mobTaxResidentsFn, iMexico)) :-
%       occuring(YEAR),
%       ~instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica)),
%       \+ ~forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)).
% instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)) :-
%       occuring(YEAR),
%       ~instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iMexico)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica)),
%       \+ ~forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)).
% instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)) :-
%       occuring(YEAR),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iMexico)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica)),
%       \+ ~forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)).
% forbiddenToDoWrt(iCW_USIncomeTax, SUPPORTER, claimsAsDependent(YEAR, SUPPORTER, SUPPORTEE)) :-
%       occuring(YEAR),
%       ~instance(PERSON, nartR(tClazzCitizenFn, iGroup_UnitedStatesOfAmerica)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_Canada)),
%       ~instance(PERSON, nartR(mobTaxResidentsFn, iMexico)),
%       \+ ~instance(PERSON, nartR(mobTaxResidentsFn, iGroup_UnitedStatesOfAmerica)).


% ================================================================================================================
%  Everything is human or god
% ================================================================================================================
:- test_boxlog(human(X) v god(X)).
% human(_19658) :-
%       ~god(_19658).
% god(_23530) :-
%       ~human(_23530).



% ================================================================================================================
%  Everything that is human is possibly male
% ================================================================================================================

:- test_boxlog(human(X) => poss(male(X))).

% ~(human(X)) :-
%       ~poss_t(male, X).
% proven_tru(poss_t(male, X)) :-
%       human(X).


% ================================================================================================================
%  Everything is human and male
% ================================================================================================================

%  BAD!! these need co-mingled!
:- test_boxlog((human(X) & male(X))).

% human(_21936).
% male(_24006).




% =======
%  Co-mingled!
% =======
:- P= (human(X) & male(X)) ,test_boxlog(poss(P) => P).

% human(X) :-
%       \+ ~human(X),
%       \+ ~male(X).
% male(X) :-
%       \+ ~human(X),
%       \+ ~male(X).


% These to?
% ~human(A) :-
%      \+ ( \+ ~male(A),
%           human(A)
%         ).
% ~human(A) :-
%      \+ ( \+ ~male(A),
%           male(A)
%         ).
% ~male(A) :-
%      \+ ( \+ ~human(A),
%           human(A)
%         ).
% ~male(A) :-
%      \+ ( \+ ~human(A),
%           male(A)
%         ).




% ================================================================================================================
%  Nothing is both human and god
% ================================================================================================================
:- test_boxlog(~ (human(X) & god(X))).

% ~human(_830) :-
%       god(_830).
% ~god(_904) :-
%       human(_904).

% ================================================================================================================
%  There exists something not evil
% ================================================================================================================
:- test_boxlog(exists(X,~evil(X))).

% ~evil(_788{sk = ...}) :-
%       skolem(_788{sk = ...}, skIsIn_8Fn).

% ================================================================================================================
%  There exists something evil
% ================================================================================================================
:- test_boxlog(exists(X,evil(X))).
% evil(_788{sk = ...}) :-
%       skolem(_788{sk = ...}, skIsIn_9Fn).

% ================================================================================================================
%  When a man exists there will be a god
% ================================================================================================================
:- test_boxlog(exists(X,man(X)) => exists(G,god(G))).
% god(_866{sk = ...}) :-
%       man(_1082),
%       skolem(_866{sk = ...}, skIsGodIn_1Fn(_1082)).
% ~man(_2276) :-
%       \+ ( skolem(_896{sk = ...}, skIsGodIn_1Fn(_2276)),
%            god(_896{sk = ...})
%          ).

% this would be better though if 
% god(_866{sk = ...}) :-
%       \= \+ (man(_1082)),
%       skolem(_866{sk = ...}, skIsGodIn_1Fn).
% ~man(_2276) :-
%       \+ god(_896).


% ================================================================================================================
%  When two men exists there will be a god
% ================================================================================================================
:- test_boxlog(atleast(2,X,man(X))=>exists(G,god(G))).

% god(_1298{sk = ...}) :-
%       skolem(_1358{sk = ...}, skIsManIn_1Fn(_10978, _1298{sk = ...})),
%       ~man(_1358{sk = ...}),
%       skolem(_1298{sk = ...}, skIsGodIn_2Fn(_10978)).
% god(_3110{sk = ...}) :-
%       man(_11144),
%       man(_11166),
%       skolem(_3110{sk = ...}, skIsGodIn_2Fn(_11166)).
% man(_2204{sk = ...}) :-
%       skolem(_2204{sk = ...}, skIsManIn_1Fn(_11314, _2224{sk = ...})),
%       skolem(_2224{sk = ...}, skIsGodIn_2Fn(_11314)),
%       \+ ~god(_2224{sk = ...}).
% ~man(_11494) :-
%       \+ ( man(_11516),
%            naf(~skolem(_4090{sk = ...}, skIsGodIn_2Fn(_11494))),
%            god(_4090{sk = ...})
%          ).
% ~man(_11656) :-
%       \+ ( man(_11678),
%            naf(~skolem(_4504{sk = ...}, skIsGodIn_2Fn(_11678))),
%            god(_4504{sk = ...})
%          ).


% OR?


% god(G) :-
%       skolem(_1316_sk, skIsManIn_1Fn(X, G)),
%       ~man(_1316_sk),
%       skolem(G, skIsGodIn_1Fn(X)).
% god(G) :-
%       man(_2720),
%       ~equals(_2742, X),
%       man(X),
%       skolem(G, skIsGodIn_1Fn(X)).
% man(_1342_sk) :-
%       skolem(_1342_sk, skIsManIn_1Fn(X, G)),
%       skolem(G, skIsGodIn_1Fn(X)),
%       \+ ~god(G).
% naf(~equals(_3108, X)) :-
%       man(_3148),
%       man(X),
%       skolem(G, skIsGodIn_1Fn(X)),
%       \+ ~god(G).
% ~man(X) :-
%       man(_3330),
%       \+ ( \+ ~ (~equals(_3352, X)),
%            naf(~skolem(G, skIsGodIn_1Fn(X))),
%            god(G)
%          ).
% ~man(_3544) :-
%       ~equals(_3566, X),
%       \+ ( man(X),
%            naf(~skolem(G, skIsGodIn_1Fn(X))),
%            god(G)
%          ).
% ~equals(_1478_sk, X) :-
%       \+ ( skolem(G, skIsGodIn_1Fn(X)),
%            god(G)
%          ).


% ================================================================================================================
% A person holding a bird is performing bird holding
% ================================================================================================================

:- test_boxlog([+assert],implies(
   and(instance(HOLD, actHoldingAnObject), objectActedOn(HOLD, BIRD), instance(BIRD, tClazzBird), 
             performedBy(HOLD, PER), instance(PER, mobPerson)), 
             holdsIn(HOLD, onPhysical(BIRD, PER)))).

% ~occuring(_2056) :-
%       instance(_2056, actHoldingAnObject),
%       objectActedOn(_2056, _2078),
%       instance(_2078, tClazzBird),
%       \+ ( performedBy(_2056, _2100),
%            naf(~instance(_2100, mobPerson)),
%            onPhysical(_2078, _2100)
%          ).
% ~instance(_2260, mobPerson) :-
%       instance(_2282, actHoldingAnObject),
%       objectActedOn(_2282, _2304),
%       instance(_2304, tClazzBird),
%       \+ ( performedBy(_2282, _2260),
%            naf(~occuring(_2282)),
%            onPhysical(_2304, _2260)
%          ).
% ~instance(_2520, tClazzBird) :-
%       instance(_2542, actHoldingAnObject),
%       objectActedOn(_2542, _2520),
%       performedBy(_2542, _2564),
%       \+ ( instance(_2564, mobPerson),
%            naf(~occuring(_2542)),
%            onPhysical(_2520, _2564)
%          ).
% ~instance(_2752, actHoldingAnObject) :-
%       objectActedOn(_2752, _2774),
%       instance(_2774, tClazzBird),
%       performedBy(_2752, _2796),
%       \+ ( instance(_2796, mobPerson),
%            naf(~occuring(_2752)),
%            onPhysical(_2774, _2796)
%          ).
% ~objectActedOn(_2984, _3006) :-
%       instance(_2984, actHoldingAnObject),
%       instance(_3006, tClazzBird),
%       performedBy(_2984, _3028),
%       \+ ( instance(_3028, mobPerson),
%            naf(~occuring(_2984)),
%            onPhysical(_3006, _3028)
%          ).
% ~performedBy(_3190, _3212) :-
%       instance(_3190, actHoldingAnObject),
%       objectActedOn(_3190, _3234),
%       instance(_3234, tClazzBird),
%       \+ ( instance(_3212, mobPerson),
%            naf(~occuring(_3190)),
%            onPhysical(_3234, _3212)
%          ).
% onPhysical(_3396, _3418) :-
%       instance(_3440, actHoldingAnObject),
%       objectActedOn(_3440, _3396),
%       instance(_3396, tClazzBird),
%       performedBy(_3440, _3418),
%       instance(_3418, mobPerson),
%       occuring(_3440).




:- test_boxlog(sourceSchemaObjectID(SOURCE, SCHEMA, uU(uSourceSchemaObjectFn, SOURCE, SCHEMA, ID), ID)).
% ~mudEquals(_1236{???UUUSOURCESCHEMAOBJECTFN1}, uU(uSourceSchemaObjectFn, _2438, _2460, _2482)) :-
%       ~sourceSchemaObjectID(_2438, _2460, _1280{???UUUSOURCESCHEMAOBJECTFN1}, _2482).
% sourceSchemaObjectID(_2614, _2636, UUUSOURCESCHEMAOBJECTFN1_VAR, _2658) :-
%       mudEquals(_1006{???UUUSOURCESCHEMAOBJECTFN1},
%                 uU(uSourceSchemaObjectFn, _2614, _2636, _2658)).


:- test_boxlog(sourceSchemaObjectID(SOURCE, SCHEMA, THING, uU(uSourceSchemaObjectIDFn, SOURCE, SCHEMA, THING))).
% ~mudEquals(_886{???UUUSOURCESCHEMAOBJECTIDFN1}, uU(uSourceSchemaObjectIDFn, _1072, _1094, _1116)) :-
%       ~sourceSchemaObjectID(_1072, _1094, _1116, _906{???UUUSOURCESCHEMAOBJECTIDFN1}).
% sourceSchemaObjectID(_1248, _1270, _1292, UUUSOURCESCHEMAOBJECTIDFN1_VAR) :-
%       mudEquals(_868{???UUUSOURCESCHEMAOBJECTIDFN1},
%                 uU(uSourceSchemaObjectIDFn, _1248, _1270, _1292)).



:- test_defunctionalize(implies(instance(YEAR, tClazzCalendarYear), temporallyFinishedBy(YEAR, uU(iTimeOf_SecondFn, 59, uU(iTimeOf_MinuteFn, 59, uU(iTimeOf_HourFn, 23, uU(iTimeOf_DayFn, 31, uU(iTimeOf_MonthFn, vDecember, YEAR)))))))).

% >(mudEquals(UUITIMEOF_SECONDFN1_VAR, uU(iTimeOf_SecondFn, 59, UUITIMEOF_MINUTEFN1_VAR)), =>(mudEquals(UUITIMEOF_MINUTEFN1_VAR, uU(iTimeOf_MinuteFn, 59, UUITIMEOF_HOURFN1_VAR)), =>(mudEquals(UUITIMEOF_HOURFN1_VAR, uU(iTimeOf_HourFn, 23, UUITIMEOF_DAYFN1_VAR)), =>(mudEquals(UUITIMEOF_DAYFN1_VAR, uU(iTimeOf_DayFn, 31, UUITIMEOF_MONTHFN1_VAR)), =>(mudEquals(UUITIMEOF_MONTHFN1_VAR, uU(iTimeOf_MonthFn, vDecember, _200)), implies(instance(_200, tClazzCalendarYear), temporallyFinishedBy(_200, UUITIMEOF_SECONDFN1_VAR))))))).


% ================================================================================================================
% At least 4 cute puppies
% ================================================================================================================

:- test_boxlog(atleast(4,X, puppy(X) & cute(X))).


:- test_boxlog([+pfc,+assert],exactly(6,X, puppy(X) & poss(cute(X)))).


% :-  test_repl.

end_of_file.



% ================================================================================================================
% At most 6 cute puppies
% ================================================================================================================

:- test_boxlog(atmost(6,X, puppy(X) & cute(X))).

% ================================================================================================================
% At exactly 5 cute puppies
% ================================================================================================================

:- test_boxlog(exactly(5,X, puppy(X) & cute(X))).


