/** * Test Bilattice Orderings for Evidential Reasoning * * This test demonstrates the bilattice orderings (≥ᵢ, ≥ₜ) for comparing * epistemic status of propositions in qualitative capacity systems. */ import { test, describe } from 'node:test'; import assert from 'node:assert'; import { QualitativeScale, QualitativeCapacity, BilatticeOrderings } from '../../src/qualitative/index.js'; describe('Bilattice Orderings', () => { test('should implement information ordering correctly', () => { const scale = QualitativeScale.fivePoint(); // Test information ordering: (c₁, c₁') ≥ᵢ (c₂, c₂') ⟺ c₁ ≥ c₂ and c₁' ≥ c₂' const epistemic1 = { belief: 0.75, disbelief: 0.5 }; const epistemic2 = { belief: 0.5, disbelief: 0.25 }; const epistemic3 = { belief: 0.75, disbelief: 0.25 }; // epistemic1 should be more informative than epistemic2 assert.ok(BilatticeOrderings.informationOrdering(epistemic1, epistemic2, scale)); // epistemic1 should be more informative than epistemic3 (higher disbelief) assert.ok(BilatticeOrderings.informationOrdering(epistemic1, epistemic3, scale)); // epistemic3 should NOT be more informative than epistemic1 (lower disbelief) assert.ok(!BilatticeOrderings.informationOrdering(epistemic3, epistemic1, scale)); }); test('should implement truth ordering correctly', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity where s1 has high belief, s2 has medium belief const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); // High belief in s1 qmt.set(new Set(['s2']), 0.5); // Medium belief in s2 qmt.set(new Set(['s1', 's2']), 1); // Full belief in s1 OR s2 const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositionA = ['s1']; // High belief const propositionB = ['s2']; // Medium belief // A should be more true than B: γ(A) ≥ γ(B) and γ(Bᶜ) ≥ γ(Aᶜ) assert.ok(BilatticeOrderings.truthOrdering(propositionA, propositionB, capacity)); // B should NOT be more true than A assert.ok(!BilatticeOrderings.truthOrdering(propositionB, propositionA, capacity)); }); test('should compare epistemic status comprehensively', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity with different belief levels const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); qmt.set(new Set(['s2']), 0.5); qmt.set(new Set(['s3']), 0.25); qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositionA = ['s1']; const propositionB = ['s2']; const comparison = BilatticeOrderings.compareEpistemicStatus(propositionA, propositionB, capacity); // Check that we get a comprehensive comparison assert.ok(comparison.propositionA); assert.ok(comparison.propositionB); assert.ok(typeof comparison.informationOrdering === 'boolean'); assert.ok(typeof comparison.truthOrdering === 'boolean'); assert.ok(typeof comparison.relationship === 'string'); assert.ok(typeof comparison.analysis === 'string'); // A should be more true than B, but not more informative assert.ok(!comparison.informationOrdering); assert.ok(comparison.truthOrdering); assert.strictEqual(comparison.relationship, 'A more true than B'); }); test('should find most informative proposition', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity with varying belief levels const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); qmt.set(new Set(['s2']), 0.5); qmt.set(new Set(['s3']), 0.25); qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositions = [['s1'], ['s2'], ['s3']]; const mostInformative = BilatticeOrderings.findMostInformative(propositions, capacity); // s1 should be most informative (highest belief and disbelief) assert.deepStrictEqual(mostInformative.proposition, ['s1']); assert.strictEqual(mostInformative.rank, 1); assert.strictEqual(mostInformative.total, 3); assert.ok(mostInformative.analysis.includes('Most informative')); }); test('should find most true proposition', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity with varying belief levels const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); qmt.set(new Set(['s2']), 0.5); qmt.set(new Set(['s3']), 0.25); qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositions = [['s1'], ['s2'], ['s3']]; const mostTrue = BilatticeOrderings.findMostTrue(propositions, capacity); // s1 should be most true (highest capacity value) assert.deepStrictEqual(mostTrue.proposition, ['s1']); assert.strictEqual(mostTrue.capacity, 0.75); assert.strictEqual(mostTrue.rank, 1); assert.strictEqual(mostTrue.total, 3); assert.ok(mostTrue.analysis.includes('Most true')); }); test('should rank propositions by information content', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity with varying belief levels const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); qmt.set(new Set(['s2']), 0.5); qmt.set(new Set(['s3']), 0.25); qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositions = [['s1'], ['s2'], ['s3']]; const ranking = BilatticeOrderings.rankByInformation(propositions, capacity); // Should have 3 ranked propositions assert.strictEqual(ranking.length, 3); // Check ranking structure for (let i = 0; i < ranking.length; i++) { assert.strictEqual(ranking[i].rank, i + 1); assert.ok(ranking[i].proposition); assert.ok(ranking[i].epistemic); assert.ok(ranking[i].analysis); } // s1 should be ranked first (most informative) assert.deepStrictEqual(ranking[0].proposition, ['s1']); }); test('should rank propositions by truth content', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity with varying belief levels const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); qmt.set(new Set(['s2']), 0.5); qmt.set(new Set(['s3']), 0.25); qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositions = [['s1'], ['s2'], ['s3']]; const ranking = BilatticeOrderings.rankByTruth(propositions, capacity); // Should have 3 ranked propositions assert.strictEqual(ranking.length, 3); // Check ranking structure for (let i = 0; i < ranking.length; i++) { assert.strictEqual(ranking[i].rank, i + 1); assert.ok(ranking[i].proposition); assert.ok(typeof ranking[i].capacity === 'number'); assert.ok(ranking[i].analysis); } // s1 should be ranked first (most true) assert.deepStrictEqual(ranking[0].proposition, ['s1']); assert.strictEqual(ranking[0].capacity, 0.75); }); test('should handle edge cases correctly', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2']; // Create a simple capacity const qmt = new Map(); qmt.set(new Set(['s1']), 0.5); qmt.set(new Set(['s1', 's2']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); // Test with single proposition const singleProposition = [['s1']]; const mostInformative = BilatticeOrderings.findMostInformative(singleProposition, capacity); const mostTrue = BilatticeOrderings.findMostTrue(singleProposition, capacity); assert.deepStrictEqual(mostInformative.proposition, ['s1']); assert.strictEqual(mostInformative.rank, 1); assert.strictEqual(mostInformative.total, 1); assert.deepStrictEqual(mostTrue.proposition, ['s1']); assert.strictEqual(mostTrue.rank, 1); assert.strictEqual(mostTrue.total, 1); }); test('should handle incomparable propositions', () => { const scale = QualitativeScale.fivePoint(); const stateSpace = ['s1', 's2', 's3']; // Create a capacity where propositions are incomparable const qmt = new Map(); qmt.set(new Set(['s1']), 0.75); // High belief, low disbelief qmt.set(new Set(['s2']), 0.5); // Medium belief, medium disbelief qmt.set(new Set(['s1', 's2']), 1); qmt.set(new Set(['s1', 's2', 's3']), 1); const capacity = new QualitativeCapacity(stateSpace, scale, qmt); const propositionA = ['s1']; const propositionB = ['s2']; const comparison = BilatticeOrderings.compareEpistemicStatus(propositionA, propositionB, capacity); // Should identify the relationship correctly assert.ok(typeof comparison.relationship === 'string'); assert.ok(comparison.relationship !== ''); }); });