Files
bikoret/talmudic_engine/test/reasoning_test.pl
T
Scott KarpandClaude Opus 4.6 adc3e41679 Eish zarah actionable items: coupling trace, grounding type, self-grounding detection, golden calf halt
Torah grounds each change:

1. interpret.pl — coupling_trace field (Vayikra 10:1, 6:6)
   Fire is zarah because "asher lo tzivah otam" — the coupling trace
   IS the tzivah trace. Records which L1 facts grounded each interpretation.

2. challenge.pl — grounding_type achorai/panim (Shemot 33:23)
   "You will see My back, but My face shall not be seen."
   Text-backed challenges = achorai. Inferred challenges = panim.

3. resolve.pl — self-grounding detection (eish_zarah_reading §5.3)
   Counter-interpretation must bring NEW L1 evidence. Prevents
   circular reasoning (Westworld problem).

4. teiku.pl — challenge_sequence in teiku_record
   Records diagnostic trail to impasse, not just verdict.

5. avodah_zarah.pl — Form 2: golden calf detection (Shemot 32:4)
   Empty coupling trace + non-low confidence = uncoupled output.
   Real gold, sincere worship, false god.

6. korban.py — pydantic BaseModel + raw_korban preservation
   Construction spec §1.4 fulfilled. Floor between input and output
   never severed.

490 tests, 0 failures (195 Prolog, 186 Python, 33 Haskell, 76 Elixir).

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

115 lines
4.0 KiB
Prolog

%% reasoning_test.pl — Tests for the dialectical reasoning engine.
:- use_module(library(plunit)).
:- use_module('../src/reasoning/interpret').
:- use_module('../src/reasoning/challenge').
:- use_module('../src/reasoning/resolve').
:- use_module('../src/reasoning/teiku').
:- use_module('../src/specification/mitzvot').
:- use_module('../src/specification/torah_text').
:- begin_tests(interpret).
%% Can interpret a case about creation
test(interpret_creation, [nondet]) :-
Case = case(test_creation, creation, [bet_resh_aleph], 'What is creation?'),
interpret(Case, Interpretation),
Interpretation = interpretation(test_creation, _, _, _, _, _).
%% Interpretation finds relevant verses
test(interpret_finds_verses, [nondet]) :-
Case = case(test_verses, creation, [bet_resh_aleph], 'Find creation verses'),
interpret(Case, interpretation(_, _, Verses, _, _, _)),
Verses \= [].
%% Interpretation finds relevant mitzvot
test(interpret_finds_mitzvot, [nondet]) :-
Case = case(test_mitzvot, judgment, [shin_pe_tet], 'How to judge?'),
interpret(Case, interpretation(_, Mitzvot, _, _, _, _)),
Mitzvot \= [].
%% High confidence when both mitzvot and verses found
test(interpret_high_confidence, [nondet]) :-
Case = case(test_conf, holiness, [qof_dalet_shin], 'What is holiness?'),
interpret(Case, interpretation(_, _, _, _, high, _)).
%% Coupling trace is present (eish_zarah_reading.md §5.1)
test(interpret_has_coupling_trace, [nondet]) :-
Case = case(test_trace, creation, [bet_resh_aleph], 'Test coupling'),
interpret(Case, interpretation(_, _, _, _, _, coupling_trace(Trace))),
Trace \= [].
%% Coupling trace records root→verse connections
test(coupling_trace_has_verse_coupling, [nondet]) :-
Case = case(test_coupling, creation, [bet_resh_aleph], 'Test verse coupling'),
interpret(Case, interpretation(_, _, _, _, _, coupling_trace(Trace))),
member(coupled(root(bet_resh_aleph), verse(_, _, _)), Trace).
:- end_tests(interpret).
:- begin_tests(challenge).
%% Can challenge an interpretation about judgment (justice vs mercy tension)
test(challenge_judgment, [nondet]) :-
Case = case(test_judgment, judgment, [shin_pe_tet, tzade_dalet_qof],
'How to judge righteously?'),
interpret(Case, Interpretation),
challenge(Interpretation, Kushya),
Kushya = kushya(_, _, _, _).
%% Challenge has a strength
test(challenge_has_strength, [nondet]) :-
Case = case(test_str, judgment, [shin_pe_tet], 'Test strength'),
interpret(Case, Interpretation),
challenge(Interpretation, kushya(_, _, Strength, _)),
member(Strength, [strong, moderate, weak]).
%% Challenge has grounding type (eish_zarah_reading.md §5.2)
test(challenge_has_grounding_type, [nondet]) :-
Case = case(test_gtype, judgment, [shin_pe_tet, tzade_dalet_qof],
'Test grounding type'),
interpret(Case, Interpretation),
challenge(Interpretation, kushya(_, _, _, GType)),
member(GType, [achorai, panim]).
%% Grounding type for mitzvah_tension is achorai (text-backed)
test(mitzvah_tension_is_achorai) :-
grounding_type(contradiction(mitzvah_tension, _, _, _), achorai).
%% Grounding type for domain_tension is panim (inferred)
test(domain_tension_is_panim) :-
grounding_type(contradiction(domain_tension, _, _, _), panim).
:- end_tests(challenge).
:- begin_tests(resolve).
%% Can resolve a simple case (no challenge)
test(resolve_simple, [nondet]) :-
Case = case(test_simple, creation, [bet_resh_aleph], 'What is creation?'),
resolve(Case, Resolution),
( Resolution = accepted(_)
; Resolution = challenged(_, _)
; Resolution = synthesized(_, _, _)
; Resolution = teiku(_)
).
%% Resolution produces some result
test(resolve_produces_result, [nondet]) :-
Case = case(test_result, holiness, [qof_dalet_shin], 'What is holiness?'),
resolve(Case, _Resolution).
:- end_tests(resolve).
:- begin_tests(teiku_module).
%% Teiku count starts at zero (or is a number)
test(teiku_count_works) :-
teiku_count(Count),
integer(Count).
:- end_tests(teiku_module).