TO USE.THEN :RULE.THENS
IF EMPTY? :RULE.THENS [OP "FALSE]
IF NOT REMEMBER FIRST :RULE.THENS [OP USE.THEN BF :RULE.THENS]
PR (SE [Rule] FIRST :RULE [deduces] FIRST :RULE.THENS)
IF USE.THEN BF :RULE.THENS [OP "TRUE]
OP "TRUE
END

TO S.RULES
R1 [[HAS HAIR]] [[IS MAMMAL]]
R2 [[GIVES MILK]] [[IS MAMMAL]]
R3 [[HAS FEATHERS]] [[IS BIRD]]
R4 [[FLIES] [LAYS EGGS]] [[IS BIRD]]
R5 [[EATS MEAT]] [[IS CARNIVORE]]
R6 [[HAS POINTED TEETH] [HAS CLAWS] [HAS FORWARD EYES]] [[IS CARNIVORE]]
R7 [[IS MAMMAL] [HAS HOOVES]] [[IS UNGULATE]]
R8 [[IS MAMMAL] [CHEWS CUD]] [[IS UNGULATE] [IS EVEN TOED]]
R9 [[IS MAMMAL] [IS CARNIVORE] [HAS TAWNY COLOUR] [HAS DARK SPOTS]] [[IS CHEETAH]]
R10 [[IS MAMMAL] [IS CARNIVORE] [HAS TAWNY COLOUR] [HAS BLACK STRIPES]] [[IS TIGER]]
R11 [[IS UNGULATE] [HAS LONG NECK] [HAS LONG LEGS]] [[IS GIRAFFE]]
R12 [[IS UNGULATE] [HAS BLACK STRIPES]] [[IS ZEBRA]]
R13 [[IS BIRD] [DOES NOT FLY] [HAS LONG NECK] [HAS LONG LEGS] [IS BLACK AND WHITE]] [[IS OSTRICH]]
R14 [[IS BIRD] [DOES NOT FLY] [SWIMS] [IS BLACK AND WHITE]] [[IS PENGUIN]]
R15 [[IS BIRD] [FLIES WELL]] [[IS ALBATROSS]]
END

TO DIAGNOSE
MAKE "FACTS BF TEXT "S.FACTS
MAKE "RULES BF TEXT "S.RULES
MAKE "ASKED []
DIAGNOSE.1 BF TEXT "HYPOTHESES
END

TO TEST.IF.PLUS :RULE.IFS
IF EMPTY? :RULE.IFS [OP "TRUE]
IF VERIFY FIRST :RULE.IFS [OP TEST.IF.PLUS BF :RULE.IFS]
OP "FALSE
END

TO IFS :RULE
OP FIRST BF :RULE
END

TO THENS :RULE
OP LAST :RULE
END

TO REMEMBER :FACT
IF MEMBER? :FACT :FACTS [OP "FALSE]
MAKE "FACTS FPUT :FACT :FACTS
OP "TRUE
END

TO ASK.QUESTION :TEXT
PR :TEXT
OP RL
END

TO SOLICIT :FACT
IF MEMBER? :FACT :ASKED [OP "FALSE]
MAKE "ANSWER ASK.QUESTION (SE [Is this true :] :FACT [?])
IF EQUAL? :ANSWER [YES] [OP REMEMBER :FACT]
IF EQUAL? :ANSWER [NO] [MAKE "ASKED FPUT :FACT :ASKED OP "FALSE]
IF EQUAL? :ANSWER [WHY] [WHY :FACT OP SOLICIT :FACT]
IF EQUAL? :ANSWER [NEW] [MAKE "RULES LPUT ACCEPT.NEW :RULES OP "NEW]
PR [PLEASE ANSWER YES,NO,WHY OR NEW]
OP SOLICIT :FACT
END

TO VERIFY.1 :L.RULES
IF EMPTY? :L.RULES [OP "FALSE]
IF TRY.RULE FIRST :L.RULES [OP "TRUE]
OP VERIFY.1 BF :L.RULES
END

TO VERIFY.2 :L.RULES
IF EMPTY? :L.RULES [OP "FALSE]
IF TRY.RULE.PLUS FIRST :L.RULES [OP "TRUE]
OP VERIFY.2 BF :L.RULES
END

TO TRY.RULE :RULE
IF TEST.IF IFS :RULE [OP USE.THEN THENS :RULE]
OP "FALSE
END

TO TRY.RULE.PLUS :RULE
IF TEST.IF.PLUS IFS :RULE [OP USE.THEN THENS :RULE]
OP "FALSE
END

TO INTHEN :FACT :L.RULES
IF EMPTY? :L.RULES [OP []]
IF MEMBER? :FACT THENS FIRST :L.RULES [OP FPUT FIRST :L.RULES INTHEN :FACT BF :L.RULES]
OP INTHEN :FACT BF :L.RULES
END

TO TEST.IF :RULE.IFS
IF EMPTY? :RULE.IFS [OP "TRUE]
IF MEMBER? FIRST :RULE.IFS :FACTS [OP TEST.IF BF :RULE.IFS]
OP "FALSE
END

TO DIAGNOSE.1 :HYPO
IF EMPTY? :HYPO [PR [No hypothesis can be confirmed] STOP]
MAKE "RULE []
PR (SE [Trying to verify hypothesis] FIRST :HYPO)
IF VERIFY FIRST :HYPO [PR (SE [Hypothesis] FIRST :HYPO [is true]) STOP]
PR (SE [Hypothesis] FIRST :HYPO [has been abandoned])
DIAGNOSE.1 BF :HYPO
END

TO VERIFY :FACT
IF MEMBER? :FACT :FACTS [OP "TRUE]
IF MEMBER? :FACT :ASKED [OP "FALSE]
IF EMPTY? INTHEN :FACT :RULES [OP CHECK SOLICIT :FACT]
IF VERIFY.1 INTHEN :FACT :RULES [OP "TRUE]
IF VERIFY.2 INTHEN :FACT :RULES [OP "TRUE]
MAKE "ASKED FPUT :FACT :ASKED
OP "FALSE
END

TO S.FACTS
HAS HAIR
EATS MEAT
HAS TAWNY COLOUR
HAS DARK SPOTS
END

TO HYPOTHESES
IS ALBATROSS
IS PENGUIN
IS OSTRICH
IS ZEBRA
IS GIRAFFE
IS TIGER
IS CHEETAH
END

TO CHECK :RESULT
IF :RESULT = "NEW [OP VERIFY :FACT]
OP :RESULT
END

TO ACCEPT.NEW
OP FPUT "RNEW ACCEPT.1
END

TO ACCEPT.1
MAKE "X RL
IF EMPTY? :X [OP []]
OP FPUT :X ACCEPT.1
END

TO WHY :FACT
IF EMPTY? :RULE [PR (SE :FACT [IS AN ISOLATED FACT] STOP]
PR (SE [TRYING TO USE RULE] FIRST :RULE)
MAKE "X WHY.1 [I ALREADY KNOW] IFS :RULE :FACT
PR (SE [IF] :FACT [IS TRUE])
IF NOT EMPTY? :X [MAKE "X WHY.1 [AND] :X []]
PR (SE [THEN] THENS :RULE [IS TRUE])
END

TO WHY.1 :TEXT :LIST :COND
IF EMPTY? :LIST [OP []]
IF (EQUAL? FIRST :LIST :COND) [OP BF :LIST]
PR (SE :TEXT FIRST :LIST [IS TRUE])
OP WHY.1 :TEXT BF :LIST :COND
END

MAKE "RULES [[R1 [[HAS HAIR]] [[IS MAMMAL]]] [R2 [[GIVES MILK]] [[IS MAMMAL]]] [R3 [[HAS FEATHERS]] [[IS BIRD]]] [R4 [[FLIES] [LAYS EGGS]] [[IS BIRD]]] [R5 [[EATS MEAT]] [[IS CARNIVORE]]] [R6 [[HAS POINTED TEETH] [HAS CLAWS] [HAS FORWARD EYES]] [[IS CARNIVORE]]] [R7 [[IS MAMMAL] [HAS HOOVES]] [[IS UNGULATE]]] [R8 [[IS MAMMAL] [CHEWS CUD]] [[IS UNGULATE] [IS EVEN TOED]]] [R9 [[IS MAMMAL] [IS CARNIVORE] [HAS TAWNY COLOUR] [HAS DARK SPOTS]] [[IS CHEETAH]]] [R10 [[IS MAMMAL] [IS CARNIVORE] [HAS TAWNY COLOUR] [HAS BLACK STRIPES]] [[IS TIGER]]] [R11 [[IS UNGULATE] [HAS LONG NECK] [HAS LONG LEGS]] [[IS GIRAFFE]]] [R12 [[IS UNGULATE] [HAS BLACK STRIPES]] [[IS ZEBRA]]] [R13 [[IS BIRD] [DOES NOT FLY] [HAS LONG NECK] [HAS LONG LEGS] [IS BLACK AND WHITE]] [[IS OSTRICH]]] [R14 [[IS BIRD] [DOES NOT FLY] [SWIMS] [IS BLACK AND WHITE]] [[IS PENGUIN]]] [R15 [[IS BIRD] [FLIES WELL]] [[IS ALBATROSS]]]]
MAKE "RULE []
MAKE "ANSWER [NO]
MAKE "X []
MAKE "ASKED [[IS TIGER] [HAS BLACK STRIPES] [IS GIRAFFE] [IS ZEBRA] [IS UNGULATE] [CHEWS CUD] [HAS HOOVES] [IS OSTRICH] [IS PENGUIN] [IS ALBATROSS] [IS BIRD] [FLIES] [HAS FEATHERS]]
MAKE "FACTS [[IS CHEETAH] [IS CARNIVORE] [IS MAMMAL] [HAS HAIR] [EATS MEAT] [HAS TAWNY COLOUR] [HAS DARK SPOTS]]
