Files
bikoret/talmudic_engine/src/diagnostic/tzaraat.pl
T
Scott KarpandClaude Opus 4.6 37390bcb8b Phase 3: Intelligence — 613 mitzvot, 13 middot, Tzara'at diagnostic
Encode all 613 mitzvot from Rambam's Sefer HaMitzvot (248 positive,
365 prohibitions). Build the 13 Middot of Rabbi Yishmael as Prolog
inference predicates for hermeneutical reasoning. Implement Tzara'at
multi-stage input validation following Vayikra 13-14. Enhance kushya
generation with kal vachomer and shnei ketuvim challenge strategies.

Architecture §4 Steps 14-15, 19-20.

New files:
  middot/   — 8 files (master + 7 rule modules)
  diagnostic/ — 4 files (tzaraat, inspection, quarantine, diagnosis)

Modified:
  mitzvot.pl     — 52 → 613 mitzvot
  relationships.pl — expanded tensions, complements, action domains
  challenge.pl   — middot-based kushya (kal vachomer, shnei ketuvim)

Tests: 293 total (184 Prolog, 76 Elixir, 33 Haskell), 0 failures.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 16:18:58 -04:00

110 lines
3.8 KiB
Prolog

%% tzaraat.pl — Master diagnostic module.
%%
%% Architecture §4, Step 19: Tzara'at diagnostic protocol.
%%
%% Multi-stage input validation following the Torah's diagnostic
%% process in Vayikra 13-14.
%%
%% The kohen (the system) examines input before processing.
%% This is NOT content filtering or censorship.
%% It is structural analysis: does the input declare what it is?
%% Does it acknowledge its limitations? Is it honest about its source?
%%
%% The diagnostic proceeds:
%% 1. Initial inspection (inspection.pl)
%% 2. If ambiguous: quarantine (quarantine.pl)
%% 3. Reinspection after quarantine
%% 4. Final determination: tahor (proceed), tamei (reject),
%% or fully_visible_tahor (the paradox)
%%
%% The Paradox of Full Visibility (Vayikra 13:13):
%% "If the tzara'at covers all the skin of the one with the affliction,
%% from his head to his feet... the kohen shall declare him tahor."
%% Input that openly declares ALL its problems is treated as pure.
%% Concealment is the disease. Transparency is the cure.
:- module(tzaraat, [
diagnose/2,
diagnose_with_record/3,
full_diagnostic_flow/3
]).
:- use_module(diagnosis).
:- use_module(inspection).
:- use_module(quarantine).
%% ============================================================
%% SINGLE-PASS DIAGNOSIS
%% ============================================================
%% diagnose(Input, Result)
%% Run the initial inspection and return the diagnosis.
diagnose(Input, Result) :-
inspect(Input, InitialState),
( terminal_state(InitialState)
-> Result = InitialState
; %% Non-terminal = quarantine needed
Result = requires_quarantine(InitialState)
).
%% ============================================================
%% DIAGNOSIS WITH RECORD
%% ============================================================
%% diagnose_with_record(InputID, Input, Record)
%% Diagnose and create a full diagnostic record.
diagnose_with_record(InputID, Input, Record) :-
inspect(Input, InitialState),
findall(S, has_sign(Input, S), Signs),
Record = diagnostic_record(
input_id(InputID),
initial_state(InitialState),
signs(Signs),
terminal(Terminal)
),
( terminal_state(InitialState)
-> Terminal = InitialState
; Terminal = pending_quarantine
).
%% ============================================================
%% FULL DIAGNOSTIC FLOW
%% ============================================================
%% full_diagnostic_flow(InputID, InputSequence, FinalState)
%%
%% InputSequence is a list of inputs representing the same data
%% at different points in time:
%% [InitialInput, AfterQuarantine1, AfterQuarantine2]
%%
%% The flow follows the Torah's multi-stage process:
%% inspect → (quarantine → reinspect)* → final state
%% Clean input — immediate tahor
full_diagnostic_flow(_InputID, [Input], declared_tahor) :-
inspect(Input, declared_tahor), !.
%% Fully visible — immediate paradox tahor
full_diagnostic_flow(_InputID, [Input], fully_visible_tahor) :-
inspect(Input, fully_visible_tahor), !.
%% Immediate tamei — reject
full_diagnostic_flow(_InputID, [Input], confirmed_tamei) :-
inspect(Input, confirmed_tamei), !.
%% Quarantine flow: initial → quarantine_1 → reinspect with second input
full_diagnostic_flow(InputID, [Initial, AfterQ1 | Rest], FinalState) :-
inspect(Initial, quarantine_1),
quarantine_input(InputID, Initial, quarantine_1),
reinspect(InputID, AfterQ1, State1),
( terminal_state(State1)
-> FinalState = State1
; %% State1 = reinspection_1 means signs unchanged, go to quarantine_2
( Rest = [AfterQ2 | _]
-> quarantine_input(InputID, AfterQ1, quarantine_2),
reinspect(InputID, AfterQ2, FinalState)
; %% No more inputs — treat as unchanged after second quarantine
FinalState = declared_tahor
)
).