From cea8e012b556c300b2009b4804a4f37503935818 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E9=92=B0?= Date: Mon, 3 Aug 2026 09:10:31 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A2=85=E8=8A=B1=E6=98=93=E6=95=B0?= =?UTF-8?q?=E8=AF=81=E6=8D=AE=E9=93=BE=E6=9E=B6=E6=9E=84=20+=2064=E5=8D=A6?= =?UTF-8?q?=E7=88=BB=E8=BE=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- calculator/src/analysis.ts | 10 +- calculator/src/evidence.ts | 625 +++++++++++++++++++++++++++++++++ calculator/src/run-hua.ts | 50 +++ calculator/src/tradition.ts | 680 ++++++++++++++++++++++++++++++++++++ 4 files changed, 1364 insertions(+), 1 deletion(-) create mode 100644 calculator/src/evidence.ts create mode 100644 calculator/src/tradition.ts diff --git a/calculator/src/analysis.ts b/calculator/src/analysis.ts index c82c563..eafe474 100644 --- a/calculator/src/analysis.ts +++ b/calculator/src/analysis.ts @@ -1,5 +1,6 @@ import { getTrigramByNumber, getRelation, WUXING_SHENG, WUXING_KE, TRIGRAMS } from './trigrams.js'; import { getHexagram, getChangedHexagram, getMutualHexagram } from './hexagrams.js'; +import { buildEvidence, type MeihuaEvidenceAnalysis } from './evidence.js'; // 排盘输入 export interface HuaInput { @@ -44,6 +45,8 @@ export interface HuaResult { question?: string; timestamp: string; }; + // 证据链(增强层,可选) + evidence?: MeihuaEvidenceAnalysis; } // 获取当前节气(用于判断旺衰) @@ -136,7 +139,7 @@ export function calculateHua(input: HuaInput): HuaResult { const yongWang = isElementWang(yongTrigram.element, season); const wangAnalysis = `当令${season}。体卦${tiTrigram.element}${tiWang ? '旺' : '衰'},用卦${yongTrigram.element}${yongWang ? '旺' : '衰'}。`; - return { + const result: HuaResult = { mainHexagram: { upper: upperTrigram, lower: lowerTrigram, hexagram: mainHex }, tiGua: { trigram: tiTrigram, position: tiPosition }, yongGua: { trigram: yongTrigram, position: yongPosition }, @@ -152,4 +155,9 @@ export function calculateHua(input: HuaInput): HuaResult { timestamp: new Date().toISOString(), }, }; + + // 生成证据链 + result.evidence = buildEvidence(result); + + return result; } diff --git a/calculator/src/evidence.ts b/calculator/src/evidence.ts new file mode 100644 index 0000000..31a5aac --- /dev/null +++ b/calculator/src/evidence.ts @@ -0,0 +1,625 @@ +/** + * 梅花易数证据链架构 + * 参考 mingyu 项目的 evidence 模式,为排盘结果增加结构化证据链 + * + * 核心原则: + * - 每个 fact 必须有具体的 limitation(不能是泛泛免责) + * - 证据链是增强层,不破坏现有排盘流程 + * - 支持/约束/反证三位一体 + */ + +import { WUXING_SHENG, WUXING_KE, getTrigramByNumber } from './trigrams.js'; +import type { HuaResult } from './analysis.js'; +import { getTraditionalText } from './tradition.js'; + +// ═══════════════════════════════════════════ +// 类型定义 +// ═══════════════════════════════════════════ + +/** 证据阶段键 */ +export type MeihuaStageKey = 'origin' | 'process' | 'result'; + +/** MeihuaFact 基础接口 — 所有 fact 的公共字段 */ +export interface MeihuaFact { + key: string; + status: string; + promptText: string; + sources: string[]; + limitation: string; +} + +/** 卦象结构事实 */ +export interface HexagramStructureFact extends MeihuaFact { + stage: MeihuaStageKey; + label: '主卦' | '互卦' | '变卦'; + hexagramName: string; + symbol: string; + upperTrigram: string; + lowerTrigram: string; + nature: string; + judgment: string; +} + +/** 阶段体用事实 */ +export interface StageEvidence extends MeihuaFact { + stage: MeihuaStageKey; + label: string; + hexagramName: string; + ti: { name: string; element: string; seasonState: string }; + yong: { name: string; element: string; seasonState: string }; + relation: string; + support: string[]; + constraints: string[]; + basis: string; +} + +/** 阶段推进事实(主→互→变的体用关系变化) */ +export interface TransitionFact extends MeihuaFact { + fromStageKey: string; + toStageKey: string; + fromStage: MeihuaStageKey; + toStage: MeihuaStageKey; + fromRelation: string; + toRelation: string; +} + +/** 反证事实 */ +export interface CounterEvidenceFact extends MeihuaFact { + ownerStageKey: string; + stage: MeihuaStageKey; + type: '体用关系限制' | '体卦月令限制' | '用卦月令限制' | '现实复核限制'; + detail: string; +} + +/** 应期事实 */ +export interface TimingFact extends MeihuaFact { + order: number; + type: '动爻层位' | '月建旺衰' | '体卦状态' | '原应期条件'; + rawText?: string; +} + +/** 传统文本事实(卦辞/爻辞) */ +export interface TraditionalTextFact extends MeihuaFact { + stage: '主卦' | '互卦' | '变卦'; + hexagram: string; + kind: '卦辞' | '爻辞' | '用辞'; + yaoPosition?: number; + applicability: '当前卦辞辅助' | '当前动爻辅助' | '未发动背景' | '特殊用辞背景'; + originalText: string; + traditionalSignals: string[]; + topicTags: string[]; +} + +/** 完整的证据链分析结果 */ +export interface MeihuaEvidenceAnalysis { + key: 'meihua:evidence'; + status: '已计算'; + // 卦象结构 + hexagramFacts: HexagramStructureFact[]; + // 阶段体用 + stages: StageEvidence[]; + // 阶段推进 + transitionFacts: TransitionFact[]; + // 反证 + counterEvidenceFacts: CounterEvidenceFact[]; + counterSummary: { status: '有明确反证' | '未见明确反证'; detail: string }; + // 应期 + timingFacts: TimingFact[]; + // 传统文本 + traditionalFacts: TraditionalTextFact[]; + // 汇总 + summary: { + factCount: number; + stageCount: number; + transitionCount: number; + counterCount: number; + traditionalCount: number; + timingCount: number; + }; + // 全局限制 + limitations: string[]; + // 原始 prompt 文本 + promptText: string; +} + +// ═══════════════════════════════════════════ +// 限制声明常量(每个类型的具体约束) +// ═══════════════════════════════════════════ + +const STAGE_FACT_LIMITATION = + '阶段体用事实只描述主卦、互卦或变卦中的体用五行关系与月令旺衰;阶段标签、支持或限制不得直接解释为现实起因、过程、结果、吉凶或成功率' as const; + +const HEXAGRAM_FACT_LIMITATION = + '主互变卦象事实只记录当前上下经卦、卦名与卦符;不得由卦名或阶段位置直接推断现实事件、人物、吉凶、成败或应期' as const; + +const TRANSITION_FACT_LIMITATION = + '阶段推进事实只比较相邻已记录阶段的体用关系变化;不得把卦内先后直接写成现实事件必然按同样顺序发生,跨阶段缺口时更不得补造中间过程' as const; + +const COUNTER_FACT_LIMITATION = + '反证事实只表示某一阶段存在泄耗、受克、休囚死或待现实复核等限制;不得把单项反证直接写成现实失败、灾祸、伤病、损失或必然结果' as const; + +const COUNTER_SUMMARY_LIMITATION = + '反证汇总只说明当前阶段核验是否发现明确限制;未见明确反证不代表现实风险为零,也不得按反证数量换算吉凶总分或成功率' as const; + +const TIMING_FACT_LIMITATION = + '应期事实只提供动爻层位、体用生克、月令旺衰与现实条件的相对触发;不得把爻位、卦数、阶段数量或旺衰换算唯一日期,也不证明事件必然发生' as const; + +const TRADITIONAL_FACT_LIMITATION = + '卦辞与爻辞是《周易》传统取象原文,只用于当前主互变结构和动爻层位的辅助解释,不证明现实吉凶、婚育、疾病、伤亡、诉讼、财物得失、人物意图或固定时间结果' as const; + +const SUMMARY_FACT_LIMITATION = + '梅花证据汇总只统计起卦、主互变卦象、体用、推进、传统文本、反证与应期事实的覆盖情况;不得按数量生成吉凶总分、成功率、人物意图或唯一日期' as const; + +// ═══════════════════════════════════════════ +// 辅助函数 +// ═══════════════════════════════════════════ + +function unique(values: string[]): string[] { + return Array.from(new Set(values.filter(Boolean))); +} + +/** 判断旺相休囚死 */ +function getSeasonState(element: string, season: string): string { + const s = season; + // 旺 + if ((s.includes('春') && element === '木') || + (s.includes('夏') && element === '火') || + (s.includes('秋') && element === '金') || + (s.includes('冬') && element === '水') || + (s.includes('末') && element === '土')) return '旺'; + // 相(被旺者所生) + if ((s.includes('春') && element === '火') || + (s.includes('夏') && element === '土') || + (s.includes('秋') && element === '水') || + (s.includes('冬') && element === '木') || + (s.includes('末') && element === '金')) return '相'; + // 休(生旺者) + if ((s.includes('春') && element === '水') || + (s.includes('夏') && element === '木') || + (s.includes('秋') && element === '土') || + (s.includes('冬') && element === '金') || + (s.includes('末') && element === '火')) return '休'; + // 囚(克旺者) + if ((s.includes('春') && element === '金') || + (s.includes('夏') && element === '水') || + (s.includes('秋') && element === '木') || + (s.includes('冬') && element === '土') || + (s.includes('末') && element === '火')) return '囚'; + // 死(被旺者所克,或被克者) + return '死'; +} + +/** 体用关系 → 支持/约束 */ +function relationEvidence(relation: string): { support: string[]; constraints: string[] } { + switch (relation) { + case '用生体': return { support: ['外来助力生扶体卦'], constraints: [] }; + case '比和': return { support: ['体用同五行,关系同气'], constraints: ['仍须结合旺衰与现实条件'] }; + case '体克用': return { support: ['体卦对用卦具有制约能力'], constraints: ['主动推进可能伴随消耗'] }; + case '体生用': return { support: ['体卦向事项一方投入'], constraints: ['体卦存在泄耗'] }; + case '用克体': return { support: [], constraints: ['外部事项对体卦形成压力'] }; + default: return { support: [], constraints: ['现有资料不足以确定五行关系'] }; + } +} + +/** 旺衰 → 支持/约束 */ +function stateEvidence(role: '体' | '用', state: string): { support: string[]; constraints: string[] } { + if (state === '旺' || state === '相') return { support: [`${role}卦得月令${state}`], constraints: [] }; + if (state === '休' || state === '囚' || state === '死') return { support: [], constraints: [`${role}卦月令${state}`] }; + return { support: [], constraints: [] }; +} + +/** 判断五行关系(返回简化标签) */ +function getRelationLabel(tiElement: string, yongElement: string): string { + if (tiElement === yongElement) return '比和'; + if (WUXING_SHENG[yongElement] === tiElement) return '用生体'; + if (WUXING_SHENG[tiElement] === yongElement) return '体生用'; + if (WUXING_KE[yongElement] === tiElement) return '用克体'; + if (WUXING_KE[tiElement] === yongElement) return '体克用'; + return '关系未定'; +} + +/** 传统文本信号分类 */ +function classifyTraditionalSignals(text: string): string[] { + const riskText = text.replace(/无咎|无悔|悔亡|无不利/g, ''); + return unique([ + /吉|亨|利|无咎|悔亡|无悔|无不利/.test(text) ? '传统有利或通达标签' : '', + /凶|厉|吝|悔|咎|灾|不利|无攸利/.test(riskText) ? '传统风险或受限标签' : '', + /贞|永贞/.test(text) ? '守正与持续条件标签' : '', + /往|征|涉|行|进|退|出|入/.test(text) ? '行动与进退标签' : '', + ]); +} + +/** 传统文本主题分类 */ +function classifyTraditionalTopics(text: string): string[] { + return unique([ + /女|妇|婚|归妹|孕|夫|妻/.test(text) ? '关系与婚育类象' : '', + /死|疾|病|灾|伤|血|丧|亡/.test(text) ? '健康伤亡与损失类象' : '', + /讼|狱|刑|伐|师|寇|攻/.test(text) ? '争议、刑罚与攻守类象' : '', + /财|资|获|得|食|畜|货/.test(text) ? '资源与得失类象' : '', + /年|月|日|岁|旬|三年|八月/.test(text) ? '传统时间措辞' : '', + /王|君子|大人|小人|侯/.test(text) ? '身份与角色类象' : '', + ]); +} + +// ═══════════════════════════════════════════ +// 证据链生成函数 +// ═══════════════════════════════════════════ + +/** + * 为排盘结果生成完整证据链 + * @param result calculateHua() 的返回值 + * @param input 原始输入(用于获取起卦参数) + */ +export function buildEvidence(result: HuaResult): MeihuaEvidenceAnalysis { + const season = result.wangShuai.season; + const dongYao = result.dongYao; + const tiElement = result.wuxingAnalysis.tiElement; + const yongElement = result.wuxingAnalysis.yongElement; + + // ── 1. 卦象结构事实 ── + const hexagramFacts = buildHexagramFacts(result); + + // ── 2. 阶段体用事实 ── + const stages = buildStageEvidence(result, season); + + // ── 3. 阶段推进事实 ── + const transitionFacts = buildTransitionFacts(stages); + + // ── 4. 反证 ── + const counterEvidenceFacts = buildCounterEvidence(stages); + const counterSummary = { + status: counterEvidenceFacts.length > 0 ? '有明确反证' as const : '未见明确反证' as const, + detail: counterEvidenceFacts.length > 0 + ? `发现${counterEvidenceFacts.length}条反证:${counterEvidenceFacts.map(f => f.detail).join(';')}` + : '当前盘面未见明确反证', + limitation: COUNTER_SUMMARY_LIMITATION, + }; + + // ── 5. 应期 ── + const timingFacts = buildTimingFacts(result, season); + + // ── 6. 传统文本 ── + const traditionalFacts = buildTraditionalFacts(result, dongYao); + + // ── 7. 汇总 ── + const factCount = hexagramFacts.length + stages.length + transitionFacts.length + + counterEvidenceFacts.length + timingFacts.length + traditionalFacts.length; + const summary = { + factCount, + stageCount: stages.length, + transitionCount: transitionFacts.length, + counterCount: counterEvidenceFacts.length, + traditionalCount: traditionalFacts.length, + timingCount: timingFacts.length, + limitation: SUMMARY_FACT_LIMITATION, + }; + + // ── 全局限制 ── + const limitations = [ + '梅花易数证据链仅描述卦象结构、体用五行关系与月令旺衰,不证明现实吉凶、成败、概率或固定应期', + '传统卦辞爻辞是《周易》原文辅助,不直接对应现实事件、人物、婚育、疾病、伤亡或诉讼', + '反证与支持仅反映盘面五行生克状态,不代表现实中的必然结果或风险为零', + '应期分析只提供相对触发条件,不得换算为绝对日期或时间节点', + ]; + + // ── promptText ── + const promptText = [ + ...hexagramFacts.map(f => f.promptText), + ...stages.map(f => f.promptText), + ...transitionFacts.map(f => f.promptText), + ...counterEvidenceFacts.map(f => f.promptText), + counterSummary.detail, + ...timingFacts.map(f => f.promptText), + ...traditionalFacts.map(f => f.promptText), + ].join('\n'); + + return { + key: 'meihua:evidence', + status: '已计算', + hexagramFacts, + stages, + transitionFacts, + counterEvidenceFacts, + counterSummary, + timingFacts, + traditionalFacts, + summary, + limitations, + promptText, + }; +} + +// ── 子生成器 ── + +function buildHexagramFacts(result: HuaResult): HexagramStructureFact[] { + const defs = [ + { stage: 'origin' as MeihuaStageKey, label: '主卦' as const, hex: result.mainHexagram.hexagram, upperName: result.mainHexagram.upper.name, lowerName: result.mainHexagram.lower.name }, + { stage: 'process' as MeihuaStageKey, label: '互卦' as const, hex: result.mutualHexagram, upperName: result.mutualHexagram.upper.name, lowerName: result.mutualHexagram.lower.name }, + { stage: 'result' as MeihuaStageKey, label: '变卦' as const, hex: result.changedHexagram, upperName: result.changedHexagram.upper.name, lowerName: result.changedHexagram.lower.name }, + ]; + return defs.map(({ stage, label, hex, upperName, lowerName }) => ({ + key: `meihua:hexagram:${stage}`, + status: '已记录', + stage, + label, + hexagramName: hex.name, + symbol: hex.symbol, + upperTrigram: upperName, + lowerTrigram: lowerName, + nature: hex.nature, + judgment: hex.judgment, + promptText: `${label}${hex.name}${hex.symbol},上${upperName}下${lowerName},${hex.judgment}`, + sources: ['先天八卦取数', '六十四卦结构'], + limitation: HEXAGRAM_FACT_LIMITATION, + })); +} + +function buildStageEvidence(result: HuaResult, season: string): StageEvidence[] { + const tiPos = result.tiGua.position; + const yongPos = result.yongGua.position; + + // 主卦体用 + const mainTiName = result.tiGua.trigram.name; + const mainYongName = result.yongGua.trigram.name; + const mainRelation = getRelationLabel(result.tiGua.trigram.element, result.yongGua.trigram.element); + + // 互卦体用:体卦位置不变,互卦对应位置 + const mutualTiNum = tiPos === 'upper' ? result.mutualHexagram.upper : result.mutualHexagram.lower; + const mutualYongNum = yongPos === 'upper' ? result.mutualHexagram.upper : result.mutualHexagram.lower; + const mutualTi = getTrigramByNumber(mutualTiNum); + const mutualYong = getTrigramByNumber(mutualYongNum); + const mutualRelation = getRelationLabel(mutualTi.element, mutualYong.element); + + // 变卦体用 + const changedTiNum = tiPos === 'upper' ? result.changedHexagram.upper : result.changedHexagram.lower; + const changedYongNum = yongPos === 'upper' ? result.changedHexagram.upper : result.changedHexagram.lower; + const changedTi = getTrigramByNumber(changedTiNum); + const changedYong = getTrigramByNumber(changedYongNum); + const changedRelation = getRelationLabel(changedTi.element, changedYong.element); + + const defs = [ + { + stage: 'origin' as MeihuaStageKey, label: '主卦', hexName: result.mainHexagram.hexagram.name, + ti: { name: mainTiName, element: result.tiGua.trigram.element }, + yong: { name: mainYongName, element: result.yongGua.trigram.element }, + relation: mainRelation, + basis: `动爻第${result.dongYao}爻在${result.dongYao <= 3 ? '下卦' : '上卦'},${result.dongYao <= 3 ? '上卦' : '下卦'}为体`, + }, + { + stage: 'process' as MeihuaStageKey, label: '互卦', hexName: result.mutualHexagram.name, + ti: { name: mutualTi.name, element: mutualTi.element }, + yong: { name: mutualYong.name, element: mutualYong.element }, + relation: mutualRelation, + basis: '体卦位置与主卦一致,互卦取主卦2/3/4爻为下卦、3/4/5爻为上卦', + }, + { + stage: 'result' as MeihuaStageKey, label: '变卦', hexName: result.changedHexagram.name, + ti: { name: changedTi.name, element: changedTi.element }, + yong: { name: changedYong.name, element: changedYong.element }, + relation: changedRelation, + basis: '体卦位置与主卦一致,变卦由动爻阴阳互换所得', + }, + ]; + + return defs.map(({ stage, label, hexName, ti, yong, relation, basis }) => { + const relEv = relationEvidence(relation); + const tiState = getSeasonState(ti.element, season); + const yongState = getSeasonState(yong.element, season); + const tiEv = stateEvidence('体', tiState); + const yongEv = stateEvidence('用', yongState); + const support = [...relEv.support, ...tiEv.support, ...yongEv.support]; + const constraints = [...relEv.constraints, ...tiEv.constraints, ...yongEv.constraints]; + const promptText = `${label}${hexName}:体卦${ti.name}${ti.element}(月令${tiState}),用卦${yong.name}${yong.element}(月令${yongState}),关系${relation};依据:${basis};支持:${support.join('、') || '未见额外增强'};限制:${constraints.join('、') || '未见明确盘内限制'}`; + return { + key: `meihua:stage:${stage}`, + status: '已计算', + stage, + label, + hexagramName: hexName, + ti: { ...ti, seasonState: tiState }, + yong: { ...yong, seasonState: yongState }, + relation, + support, + constraints, + basis, + promptText, + sources: ['动爻所在经卦定体用规则', '主卦、互卦、变卦上下经卦五行', `月建${season}与五行旺相休囚死关系`], + limitation: STAGE_FACT_LIMITATION, + }; + }); +} + +function buildTransitionFacts(stages: StageEvidence[]): TransitionFact[] { + const transitions: TransitionFact[] = []; + for (let i = 0; i < stages.length - 1; i++) { + const from = stages[i]; + const to = stages[i + 1]; + const changed = from.relation !== to.relation; + transitions.push({ + key: `meihua:transition:${from.stage}-${to.stage}`, + status: '连续', + fromStageKey: from.key, + toStageKey: to.key, + fromStage: from.stage, + toStage: to.stage, + fromRelation: from.relation, + toRelation: to.relation, + promptText: `${from.label}→${to.label}:体用关系由「${from.relation}」${changed ? '变为' : '保持'}「${to.relation}」${changed ? ',存在变化' : ',关系稳定'}`, + sources: ['阶段体用关系比较'], + limitation: TRANSITION_FACT_LIMITATION, + }); + } + return transitions; +} + +function buildCounterEvidence(stages: StageEvidence[]): CounterEvidenceFact[] { + const counters: CounterEvidenceFact[] = []; + for (const stage of stages) { + // 体卦受克 + if (stage.relation === '用克体') { + counters.push({ + key: `meihua:counter:${stage.stage}:用克体`, + ownerStageKey: stage.key, + stage: stage.stage, + type: '体用关系限制', + status: '已触发', + detail: `${stage.label}体卦${stage.ti.name}${stage.ti.element}受用卦${stage.yong.name}${stage.yong.element}克制`, + promptText: `反证:${stage.label}体卦${stage.ti.name}受用卦${stage.yong.name}克制,存在外来压力`, + sources: ['五行克关系'], + limitation: COUNTER_FACT_LIMITATION, + }); + } + // 体生用(泄耗) + if (stage.relation === '体生用') { + counters.push({ + key: `meihua:counter:${stage.stage}:体生用`, + ownerStageKey: stage.key, + stage: stage.stage, + type: '体用关系限制', + status: '已触发', + detail: `${stage.label}体卦${stage.ti.name}${stage.ti.element}生用卦${stage.yong.name}${stage.yong.element},体卦泄耗`, + promptText: `反证:${stage.label}体卦${stage.ti.name}生用卦${stage.yong.name},体卦存在泄耗`, + sources: ['五行生关系'], + limitation: COUNTER_FACT_LIMITATION, + }); + } + // 体卦休囚死 + if (['休', '囚', '死'].includes(stage.ti.seasonState)) { + counters.push({ + key: `meihua:counter:${stage.stage}:体卦${stage.ti.seasonState}`, + ownerStageKey: stage.key, + stage: stage.stage, + type: '体卦月令限制', + status: '已触发', + detail: `${stage.label}体卦${stage.ti.name}${stage.ti.element}月令${stage.ti.seasonState},不得时`, + promptText: `反证:${stage.label}体卦${stage.ti.name}月令${stage.ti.seasonState},体卦不得时`, + sources: ['月令旺衰'], + limitation: COUNTER_FACT_LIMITATION, + }); + } + } + return counters; +} + +function buildTimingFacts(result: HuaResult, season: string): TimingFact[] { + const facts: TimingFact[] = []; + const tiElement = result.tiGua.trigram.element; + + // 动爻层位 + facts.push({ + key: 'meihua:timing:dongYao', + order: 1, + type: '动爻层位', + status: '已计算', + rawText: `动爻第${result.dongYao}爻`, + promptText: `应期参考:动爻第${result.dongYao}爻(${result.dongYao <= 3 ? '下卦' : '上卦'}),动爻所在经卦为用卦`, + sources: ['动爻位置'], + limitation: TIMING_FACT_LIMITATION, + }); + + // 月建旺衰 + facts.push({ + key: 'meihua:timing:season', + order: 2, + type: '月建旺衰', + status: '已计算', + rawText: season, + promptText: `应期参考:当令${season},体卦${tiElement}${result.wangShuai.tiWang ? '旺' : '衰'}`, + sources: ['月令旺衰'], + limitation: TIMING_FACT_LIMITATION, + }); + + // 体卦状态 + const tiState = getSeasonState(tiElement, season); + facts.push({ + key: 'meihua:timing:tiState', + order: 3, + type: '体卦状态', + status: '已计算', + rawText: `体卦${result.tiGua.trigram.name}${tiElement}月令${tiState}`, + promptText: `应期参考:体卦${result.tiGua.trigram.name}${tiElement}月令${tiState},${tiState === '旺' || tiState === '相' ? '体旺则应期近' : '体衰则应期远或需待旺时'}`, + sources: ['体卦月令状态'], + limitation: TIMING_FACT_LIMITATION, + }); + + return facts; +} + +function buildTraditionalFacts(result: HuaResult, dongYao: number): TraditionalTextFact[] { + const stages = [ + { stage: '主卦' as const, upperNum: result.mainHexagram.upper.number, lowerNum: result.mainHexagram.lower.number, hexName: result.mainHexagram.hexagram.name, judgment: result.mainHexagram.hexagram.judgment }, + { stage: '互卦' as const, upperNum: result.mutualHexagram.upper as number, lowerNum: result.mutualHexagram.lower as number, hexName: result.mutualHexagram.name, judgment: result.mutualHexagram.judgment }, + { stage: '变卦' as const, upperNum: result.changedHexagram.upper as number, lowerNum: result.changedHexagram.lower as number, hexName: result.changedHexagram.name, judgment: result.changedHexagram.judgment }, + ]; + + const facts: TraditionalTextFact[] = []; + + for (const { stage, upperNum, lowerNum, hexName, judgment } of stages) { + const text = getTraditionalText(upperNum, lowerNum); + if (!text) continue; + + // 卦辞 + const judgmentSignals = classifyTraditionalSignals(judgment); + const judgmentTopics = classifyTraditionalTopics(judgment); + facts.push({ + key: `${stage}:${hexName}:卦辞`, + status: '已映射', + stage, + hexagram: hexName, + kind: '卦辞', + applicability: '当前卦辞辅助', + originalText: judgment, + promptText: `${stage}${hexName}卦辞「${judgment}」包含${judgmentSignals.join('、') || '未见明确标签'},涉及${judgmentTopics.join('、') || '通用处境类象'};只作为该阶段卦象的传统分类辅助`, + traditionalSignals: judgmentSignals, + topicTags: judgmentTopics, + sources: ['《周易》卦辞', '六十四卦原文资料'], + limitation: TRADITIONAL_FACT_LIMITATION, + }); + + // 爻辞 + for (let i = 0; i < text.yaoCi.length; i++) { + const yaoPosition = i + 1; + const isMoving = stage === '主卦' && yaoPosition === dongYao; + const yaoText = text.yaoCi[i]; + const yaoSignals = classifyTraditionalSignals(yaoText); + const yaoTopics = classifyTraditionalTopics(yaoText); + facts.push({ + key: `${stage}:${hexName}:爻辞:${yaoPosition}`, + status: '已映射', + stage, + hexagram: hexName, + kind: '爻辞', + yaoPosition, + applicability: isMoving ? '当前动爻辅助' : '未发动背景', + originalText: yaoText, + promptText: `${stage}${hexName}第${yaoPosition}爻「${yaoText}」包含${yaoSignals.join('、') || '未见明确标签'},涉及${yaoTopics.join('、') || '通用处境类象'};${isMoving ? '当前爻位已发动,可作为动爻层位的传统辅助' : '当前爻位未发动,不作为独立判断依据'}`, + traditionalSignals: yaoSignals, + topicTags: yaoTopics, + sources: ['《周易》爻辞', '六十四卦逐爻原文资料'], + limitation: TRADITIONAL_FACT_LIMITATION, + }); + } + + // 用辞(乾坤) + if (text.yongCi) { + const yongSignals = classifyTraditionalSignals(text.yongCi); + const yongTopics = classifyTraditionalTopics(text.yongCi); + facts.push({ + key: `${stage}:${hexName}:用辞`, + status: '已映射', + stage, + hexagram: hexName, + kind: '用辞', + applicability: '特殊用辞背景', + originalText: text.yongCi, + promptText: `${stage}${hexName}用辞「${text.yongCi}」包含${yongSignals.join('、') || '未见明确标签'},涉及${yongTopics.join('、') || '通用处境类象'};本次采用单动爻起卦,不满足六爻皆变的特殊用辞条件`, + traditionalSignals: yongSignals, + topicTags: yongTopics, + sources: ['《周易》乾坤用九用六', '六十四卦特殊用辞资料'], + limitation: TRADITIONAL_FACT_LIMITATION, + }); + } + } + + return facts; +} diff --git a/calculator/src/run-hua.ts b/calculator/src/run-hua.ts index 5142236..2e53860 100644 --- a/calculator/src/run-hua.ts +++ b/calculator/src/run-hua.ts @@ -91,5 +91,55 @@ ${mutual.fullName} (${mutual.symbol}) 卦辞:${mutual.judgment} `; + // 证据链摘要 + if (r.evidence) { + const ev = r.evidence; + text += ` +─────────────────────────────────── + 证 据 链 +─────────────────────────────────── +`; + // 阶段体用 + for (const s of ev.stages) { + text += `【${s.label}】${s.hexagramName}:体${s.ti.name}${s.ti.element}(${s.ti.seasonState})vs 用${s.yong.name}${s.yong.element}(${s.yong.seasonState})→ ${s.relation} +`; + } + // 推进 + if (ev.transitionFacts.length > 0) { + text += ` +【阶段推进】 +`; + for (const t of ev.transitionFacts) { + text += ` ${t.promptText} +`; + } + } + // 反证 + text += ` +【反证】${ev.counterSummary.detail} +`; + // 应期 + if (ev.timingFacts.length > 0) { + text += ` +【应期参考】 +`; + for (const t of ev.timingFacts) { + text += ` ${t.promptText} +`; + } + } + // 传统文本(仅动爻爻辞) + const movingYaoFacts = ev.traditionalFacts.filter(f => f.applicability === '当前动爻辅助'); + if (movingYaoFacts.length > 0) { + text += ` +【动爻爻辞】 +`; + for (const f of movingYaoFacts) { + text += ` ${f.originalText} +`; + } + } + } + return text; } diff --git a/calculator/src/tradition.ts b/calculator/src/tradition.ts new file mode 100644 index 0000000..2a0f6d5 --- /dev/null +++ b/calculator/src/tradition.ts @@ -0,0 +1,680 @@ +/** + * 64卦传统文本数据 — 爻辞、用辞 + * 来源:《周易》原文 + * 数据结构:上卦×下卦 → { yaoCi[6], yongCi? } + */ + +export interface TraditionalText { + yaoCi: string[]; // 六爻爻辞(初爻→上爻) + yongCi?: string; // 用九/用辞(仅乾、坤等特殊卦) +} + +// 上卦×下卦 → 传统文本 +const TEXTS: Record = { + // ── 乾宫 ── + '1,1': { // 乾为天 + yaoCi: [ + '初九:潜龙勿用。', + '九二:见龙在田,利见大人。', + '九三:君子终日乾乾,夕惕若厉,无咎。', + '九四:或跃在渊,无咎。', + '九五:飞龙在天,利见大人。', + '上九:亢龙有悔。', + ], + yongCi: '用九:见群龙无首,吉。', + }, + '1,2': { // 天泽履 + yaoCi: [ + '初九:素履,往无咎。', + '九二:履道坦坦,幽人贞吉。', + '六三:眇能视,跛能履,履虎尾,咥人凶。武人为于大君。', + '九四:履虎尾,愬愬终吉。', + '九五:夬履,贞厉。', + '上九:视履考祥,其旋元吉。', + ], + }, + '1,3': { // 天火同人 + yaoCi: [ + '初九:同人于门,无咎。', + '六二:同人于宗,吝。', + '九三:伏戎于莽,升其高陵,三岁不兴。', + '九四:乘其墉,弗克攻,吉。', + '九五:同人先号咷而后笑,大师克相遇。', + '上九:同人于郊,无悔。', + ], + }, + '1,4': { // 天雷无妄 + yaoCi: [ + '初九:无妄,往吉。', + '六二:不耕获,不菑畲,则利有攸往。', + '六三:无妄之灾,或系之牛,行人之得,邑人之灾。', + '九四:可贞,无咎。', + '九五:无妄之疾,勿药有喜。', + '上九:无妄,行有眚,无攸利。', + ], + }, + '1,5': { // 天风姤 + yaoCi: [ + '初六:系于金柅,贞吉。有攸往,见凶。羸豕孚蹢躅。', + '九二:包有鱼,无咎,不利宾。', + '九三:臀无肤,其行次且,厉,无大咎。', + '九四:包无鱼,起凶。', + '九五:以杞包瓜,含章,有陨自天。', + '上九:姤其角,吝,无咎。', + ], + }, + '1,6': { // 天水讼 + yaoCi: [ + '初六:不永所事,小有言,终吉。', + '九二:不克讼,归而逋,其邑人三百户无眚。', + '六三:食旧德,贞厉,终吉。或从王事,无成。', + '九四:不克讼,复即命渝,安贞吉。', + '九五:讼,元吉。', + '上九:或锡之鞶带,终朝三褫之。', + ], + }, + '1,7': { // 天山遁 + yaoCi: [ + '初六:遁尾,厉,勿用有攸往。', + '六二:执之用黄牛之革,莫之胜说。', + '九三:系遁,有疾厉。畜臣妾吉。', + '九四:好遁,君子吉,小人否。', + '九五:嘉遁,贞吉。', + '上九:肥遁,无不利。', + ], + }, + '1,8': { // 天地否 + yaoCi: [ + '初六:拔茅茹以其汇,贞吉亨。', + '六二:包承,小人吉,大人否亨。', + '六三:包羞。', + '九四:有命无咎,畴离祉。', + '九五:休否,大人吉。其亡其亡,系于苞桑。', + '上九:倾否,先否后喜。', + ], + }, + + // ── 兑宫 ── + '2,1': { // 泽天夬 + yaoCi: [ + '初九:壮于前趾,往不胜为咎。', + '九二:惕号,莫夜有戎,勿恤。', + '九三:壮于頄,有凶。君子夬夬独行,遇雨若濡,有愠无咎。', + '九四:臀无肤,其行次且。牵羊悔亡,闻言不信。', + '九五:苋陆夬夬,中行无咎。', + '上六:无号,终有凶。', + ], + }, + '2,2': { // 兑为泽 + yaoCi: [ + '初九:和兑,吉。', + '九二:孚兑,吉,悔亡。', + '六三:来兑,凶。', + '九四:商兑未宁,介疾有喜。', + '九五:孚于剥,有厉。', + '上六:引兑。', + ], + }, + '2,3': { // 泽火革 + yaoCi: [ + '初九:巩用黄牛之革。', + '六二:己日乃革之,征吉,无咎。', + '九三:征凶,贞厉。革言三就,有孚。', + '九四:悔亡,有孚改命,吉。', + '九五:大人虎变,未占有孚。', + '上六:君子豹变,小人革面。征凶,居贞吉。', + ], + }, + '2,4': { // 泽雷随 + yaoCi: [ + '初九:官有渝,贞吉。出门交有功。', + '六二:系小子,失丈夫。', + '六三:系丈夫,失小子。随有求得,利居贞。', + '九四:随有获,贞凶。有孚在道,以明,何咎。', + '九五:孚于嘉,吉。', + '上六:拘系之,乃从维之。王用亨于西山。', + ], + }, + '2,5': { // 泽风大过 + yaoCi: [ + '初六:藉用白茅,无咎。', + '九二:枯杨生稊,老夫得其女妻,无不利。', + '九三:栋桡,凶。', + '九四:栋隆,吉。有它吝。', + '九五:枯杨生华,老妇得其士夫,无咎无誉。', + '上六:过涉灭顶,凶,无咎。', + ], + }, + '2,6': { // 泽水困 + yaoCi: [ + '初六:臀困于株木,入于幽谷,三岁不觌。', + '九二:困于酒食,朱绂方来,利用享祀。征凶,无咎。', + '六三:困于石,据于蒺藜,入其宫不见其妻,凶。', + '九四:来徐徐,困于金车,吝,有终。', + '九五:劓刖,困于赤绂,乃徐有说,利用祭祀。', + '上六:困于葛藟,于臲卼,曰动悔。有悔,征吉。', + ], + }, + '2,7': { // 泽山咸 + yaoCi: [ + '初六:咸其拇。', + '六二:咸其腓,凶,居吉。', + '九三:咸其股,执其随,往吝。', + '九四:贞吉悔亡,憧憧往来,朋从尔思。', + '九五:咸其脢,无悔。', + '上六:咸其辅颊舌。', + ], + }, + '2,8': { // 泽地萃 + yaoCi: [ + '初六:有孚不终,乃乱乃萃,若号一握为笑,勿恤,往无咎。', + '六二:引吉,无咎。孚乃利用禴。', + '六三:萃如嗟如,无攸利,往无咎,小吝。', + '九四:大吉,无咎。', + '九五:萃有位,无咎。匪孚,元永贞,悔亡。', + '上六:赍咨涕洟,无咎。', + ], + }, + + // ── 离宫 ── + '3,1': { // 火天大有 + yaoCi: [ + '初九:无交害,匪咎,艰则无咎。', + '九二:大车以载,有攸往,无咎。', + '九三:公用亨于天子,小人弗克。', + '九四:匪其彭,无咎。', + '六五:厥孚交如威如,吉。', + '上九:自天祐之,吉无不利。', + ], + }, + '3,2': { // 火泽睽 + yaoCi: [ + '初九:悔亡。丧马勿逐,自复。见恶人,无咎。', + '九二:遇主于巷,无咎。', + '六三:见舆曳,其牛掣,其人天且劓,无初有终。', + '九四:睽孤,遇元夫,交孚,厉无咎。', + '六五:悔亡。厥宗噬肤,往何咎。', + '上九:睽孤,见豕负涂,载鬼一车,先张之弧,后说之弧,匪寇婚媾,往遇雨则吉。', + ], + }, + '3,3': { // 离为火 + yaoCi: [ + '初九:履错然,敬之无咎。', + '六二:黄离,元吉。', + '九三:日昃之离,不鼓缶而歌,则大耋之嗟,凶。', + '九四:突如其来如,焚如,死如,弃如。', + '六五:出涕沱若,戚嗟若,吉。', + '上九:王用出征,有嘉折首,获匪其丑,无咎。', + ], + }, + '3,4': { // 火雷噬嗑 + yaoCi: [ + '初九:屦校灭趾,无咎。', + '六二:噬肤灭鼻,无咎。', + '六三:噬腊肉,遇毒。小吝,无咎。', + '九四:噬干胏,得金矢。利艰贞,吉。', + '六五:噬干肉,得黄金。贞厉,无咎。', + '上九:何校灭耳,凶。', + ], + }, + '3,5': { // 火风鼎 + yaoCi: [ + '初六:鼎颠趾,利出否。得妾以其子,无咎。', + '九二:鼎有实,我仇有疾,不我能即,吉。', + '九三:鼎耳革,其行塞,雉膏不食,方雨亏悔,终吉。', + '九四:鼎折足,覆公餗,其形渥,凶。', + '六五:鼎黄耳金铉,利贞。', + '上九:鼎玉铉,大吉,无不利。', + ], + }, + '3,6': { // 火水未济 + yaoCi: [ + '初六:濡其尾,吝。', + '九二:曳其轮,贞吉。', + '六三:未济,征凶。利涉大川。', + '九四:贞吉,悔亡。震用伐鬼方,三年有赏于大国。', + '六五:贞吉,无悔。君子之光,有孚,吉。', + '上九:有孚于饮酒,无咎。濡其首,有孚失是。', + ], + }, + '3,7': { // 火山旅 + yaoCi: [ + '初六:旅琐琐,斯其所取灾。', + '六二:旅即次,怀其资,得童仆贞。', + '九三:旅焚其次,丧其童仆,贞厉。', + '九四:旅于处,得其资斧,我心不快。', + '六五:射雉一矢亡,终以誉命。', + '上九:鸟焚其巢,旅人先笑后号咷。丧牛于易,凶。', + ], + }, + '3,8': { // 火地晋 + yaoCi: [ + '初六:晋如摧如,贞吉。罔孚裕无咎。', + '六二:晋如愁如,贞吉。受兹介福于其王母。', + '六三:众允,悔亡。', + '九四:晋如鼫鼠,贞厉。', + '六五:悔亡。失得勿恤。往吉,无不利。', + '上九:晋其角,维用伐邑。厉吉无咎,贞吝。', + ], + }, + + // ── 震宫 ── + '4,1': { // 雷天大壮 + yaoCi: [ + '初九:壮于趾,征凶,有孚。', + '九二:贞吉。', + '九三:小人用壮,君子用罔。贞厉。羝羊触藩,羸其角。', + '九四:贞吉悔亡。藩决不羸,壮于大舆之輹。', + '六五:丧羊于易,无悔。', + '上六:羝羊触藩,不能退,不能遂,无攸利。艰则吉。', + ], + }, + '4,2': { // 雷泽归妹 + yaoCi: [ + '初九:归妹以娣,跛能履,征吉。', + '九二:眇能视,利幽人之贞。', + '六三:归妹以须,反归以娣。', + '九四:归妹愆期,迟归有时。', + '六五:帝乙归妹,其君之袂不如其娣之袂良。月几望,吉。', + '上六:女承筐无实,士刲羊无血,无攸利。', + ], + }, + '4,3': { // 雷火丰 + yaoCi: [ + '初九:遇其配主,虽旬无咎,往有尚。', + '六二:丰其蔀,日中见斗,往得疑疾。有孚发若,吉。', + '九三:丰其沛,日中见沬,折其右肱,无咎。', + '九四:丰其蔀,日中见斗,遇其夷主,吉。', + '六五:来章,有庆誉,吉。', + '上六:丰其屋,蔀其家,窥其户,阒其无人,三岁不觌,凶。', + ], + }, + '4,4': { // 震为雷 + yaoCi: [ + '初九:震来虩虩,后笑言哑哑,吉。', + '六二:震来厉,亿丧贝。跻于九陵,勿逐,七日得。', + '六三:震苏苏,震行无眚。', + '九四:震遂泥。', + '六五:震往来厉,亿无丧,有事。', + '上六:震索索,视矍矍,征凶。震不于其躬,于其邻,无咎。婚媾有言。', + ], + }, + '4,5': { // 雷风恒 + yaoCi: [ + '初六:浚恒,贞凶,无攸利。', + '九二:悔亡。', + '九三:不恒其德,或承之羞,贞吝。', + '九四:田无禽。', + '六五:恒其德,贞,妇人吉,夫子凶。', + '上六:振恒,凶。', + ], + }, + '4,6': { // 雷水解 + yaoCi: [ + '初六:无咎。', + '九二:田获三狐,得黄矢,贞吉。', + '六三:负且乘,致寇至,贞吝。', + '九四:解而拇,朋至斯孚。', + '六五:君子维有解,吉。有孚于小人。', + '上六:公用射隼于高墉之上,获之,无不利。', + ], + }, + '4,7': { // 雷山小过 + yaoCi: [ + '初六:飞鸟以凶。', + '六二:过其祖,遇其妣,不及其君,遇其臣,无咎。', + '九三:弗过防之,从或戕之,凶。', + '九四:无咎。弗过遇之,往厉必戒,勿用永贞。', + '六五:密云不雨,自我西郊。公弋取彼在穴。', + '上六:弗遇过之,飞鸟离之,凶,是谓灾眚。', + ], + }, + '4,8': { // 雷地豫 + yaoCi: [ + '初六:鸣豫,凶。', + '六二:介于石,不终日,贞吉。', + '六三:盱豫悔,迟有悔。', + '九四:由豫,大有得。勿疑,朋盍簪。', + '六五:贞疾,恒不死。', + '上六:冥豫,成有渝,无咎。', + ], + }, + + // ── 巽宫 ── + '5,1': { // 风天小畜 + yaoCi: [ + '初九:复自道,何其咎,吉。', + '九二:牵复,吉。', + '九三:舆说辐,夫妻反目。', + '六四:有孚,血去惕出,无咎。', + '九五:有孚挛如,富以其邻。', + '上九:既雨既处,尚德载。妇贞厉。月几望,君子征凶。', + ], + }, + '5,2': { // 风泽中孚 + yaoCi: [ + '初九:虞吉,有它不燕。', + '九二:鹤鸣在阴,其子和之。我有好爵,吾与尔靡之。', + '六三:得敌,或鼓或罢,或泣或歌。', + '六四:月几望,马匹亡,无咎。', + '九五:有孚挛如,无咎。', + '上九:翰音登于天,贞凶。', + ], + }, + '5,3': { // 风火家人 + yaoCi: [ + '初九:闲有家,悔亡。', + '六二:无攸遂,在中馈,贞吉。', + '九三:家人嗃嗃,悔厉吉。妇子嘻嘻,终吝。', + '六四:富家,大吉。', + '九五:王假有家,勿恤,吉。', + '上九:有孚威如,终吉。', + ], + }, + '5,4': { // 风雷益 + yaoCi: [ + '初九:利用为大作,元吉,无咎。', + '六二:或益之十朋之龟,弗克违,永贞吉。王用享于帝,吉。', + '六三:益之用凶事,无咎。有孚中行,告公用圭。', + '六四:中行告公从,利用为依迁国。', + '九五:有孚惠心,勿问元吉。有孚惠我德。', + '上九:莫益之,或击之,立心勿恒,凶。', + ], + }, + '5,5': { // 巽为风 + yaoCi: [ + '初六:进退,利武人之贞。', + '九二:巽在床下,用史巫纷若,吉,无咎。', + '九三:频巽,吝。', + '六四:悔亡,田获三品。', + '九五:贞吉悔亡,无不利。无初有终。先庚三日,后庚三日,吉。', + '上九:巽在床下,丧其资斧,贞凶。', + ], + }, + '5,6': { // 风水涣 + yaoCi: [ + '初六:用拯马壮,吉。', + '九二:涣奔其机,悔亡。', + '六三:涣其躬,无悔。', + '六四:涣其群,元吉。涣有丘,匪夷所思。', + '九五:涣汗其大号,涣王居,无咎。', + '上九:涣其血去逖出,无咎。', + ], + }, + '5,7': { // 风山渐 + yaoCi: [ + '初六:鸿渐于干,小子厉,有言,无咎。', + '六二:鸿渐于磐,饮食衎衎,吉。', + '九三:鸿渐于陆,夫征不复,妇孕不育,凶。利御寇。', + '六四:鸿渐于木,或得其桷,无咎。', + '九五:鸿渐于陵,妇三岁不孕,终莫之胜,吉。', + '上九:鸿渐于逵,其羽可用为仪,吉。', + ], + }, + '5,8': { // 风地观 + yaoCi: [ + '初六:童观,小人无咎,君子吝。', + '六二:窥观,利女贞。', + '六三:观我生,进退。', + '六四:观国之光,利用宾于王。', + '九五:观我生,君子无咎。', + '上九:观其生,君子无咎。', + ], + }, + + // ── 坎宫 ── + '6,1': { // 水天需 + yaoCi: [ + '初九:需于郊,利用恒,无咎。', + '九二:需于沙,小有言,终吉。', + '九三:需于泥,致寇至。', + '六四:需于血,出自穴。', + '九五:需于酒食,贞吉。', + '上六:入于穴,有不速之客三人来,敬之终吉。', + ], + }, + '6,2': { // 水泽节 + yaoCi: [ + '初九:不出户庭,无咎。', + '九二:不出门庭,凶。', + '六三:不节若,则嗟若,无咎。', + '六四:安节,亨。', + '九五:甘节,吉,往有尚。', + '上六:苦节,贞凶,悔亡。', + ], + }, + '6,3': { // 水火既济 + yaoCi: [ + '初九:曳其轮,濡其尾,无咎。', + '六二:妇丧其茀,勿逐,七日得。', + '九三:高宗伐鬼方,三年克之,小人勿用。', + '六四:繻有衣袽,终日戒。', + '九五:东邻杀牛,不如西邻之禴祭,实受其福。', + '上六:濡其首,厉。', + ], + }, + '6,4': { // 水雷屯 + yaoCi: [ + '初九:磐桓,利居贞,利建侯。', + '六二:屯如邅如,乘马班如。匪寇,婚媾。女子贞不字,十年乃字。', + '六三:即鹿无虞,惟入于林中,君子几不如舍,往吝。', + '六四:乘马班如,求婚媾,往吉,无不利。', + '九五:屯其膏,小贞吉,大贞凶。', + '上六:乘马班如,泣血涟如。', + ], + }, + '6,5': { // 水风井 + yaoCi: [ + '初六:井泥不食,旧井无禽。', + '九二:井谷射鲋,瓮敝漏。', + '九三:井渫不食,为我心恻,可用汲。王明,并受其福。', + '六四:井甃,无咎。', + '九五:井冽寒泉,食。', + '上六:井收勿幕,有孚元吉。', + ], + }, + '6,6': { // 坎为水 + yaoCi: [ + '初六:习坎,入于坎窞,凶。', + '九二:坎有险,求小得。', + '六三:来之坎坎,险且枕,入于坎窞,勿用。', + '六四:樽酒簋贰,用缶,纳约自牖,终无咎。', + '九五:坎不盈,祗既平,无咎。', + '上六:系用徽纆,寘于丛棘,三岁不得,凶。', + ], + }, + '6,7': { // 水山蹇 + yaoCi: [ + '初六:往蹇来誉。', + '六二:王臣蹇蹇,匪躬之故。', + '九三:往蹇来反。', + '六四:往蹇来连。', + '九五:大蹇朋来。', + '上六:往蹇来硕,吉。利见大人。', + ], + }, + '6,8': { // 水地比 + yaoCi: [ + '初六:有孚比之,无咎。有孚盈缶,终来有它,吉。', + '六二:比之自内,贞吉。', + '六三:比之匪人。', + '六四:外比之,贞吉。', + '九五:显比。王用三驱,失前禽。邑人不诫,吉。', + '上六:比之无首,凶。', + ], + }, + + // ── 艮宫 ── + '7,1': { // 山天大畜 + yaoCi: [ + '初九:有厉,利已。', + '九二:舆说輹。', + '九三:良马逐,利艰贞。曰闲舆卫,利有攸往。', + '六四:童牛之牿,元吉。', + '六五:豶豕之牙,吉。', + '上九:何天之衢,亨。', + ], + }, + '7,2': { // 山泽损 + yaoCi: [ + '初九:已事遄往,无咎。酌损之。', + '九二:利贞,征凶。弗损益之。', + '六三:三人行则损一人,一人行则得其友。', + '六四:损其疾,使遄有喜,无咎。', + '六五:或益之十朋之龟,弗克违,元吉。', + '上九:弗损益之,无咎,贞吉。利有攸往,得臣无家。', + ], + }, + '7,3': { // 山火贲 + yaoCi: [ + '初九:贲其趾,舍车而徒。', + '六二:贲其须。', + '九三:贲如濡如,永贞吉。', + '六四:贲如皤如,白马翰如,匪寇婚媾。', + '六五:贲于丘园,束帛戋戋,吝,终吉。', + '上九:白贲,无咎。', + ], + }, + '7,4': { // 山雷颐 + yaoCi: [ + '初九:舍尔灵龟,观我朵颐,凶。', + '六二:颠颐,拂经于丘颐,征凶。', + '六三:拂颐,贞凶,十年勿用,无攸利。', + '六四:颠颐,吉。虎视眈眈,其欲逐逐,无咎。', + '六五:拂经,居贞吉,不可涉大川。', + '上九:由颐,厉吉,利涉大川。', + ], + }, + '7,5': { // 山风蛊 + yaoCi: [ + '初六:干父之蛊,有子,考无咎,厉终吉。', + '九二:干母之蛊,不可贞。', + '九三:干父之蛊,小有悔,无大咎。', + '六四:裕父之蛊,往见吝。', + '六五:干父之蛊,用誉。', + '上九:不事王侯,高尚其事。', + ], + }, + '7,6': { // 山水蒙 + yaoCi: [ + '初六:发蒙,利用刑人,用说桎梏,以往吝。', + '九二:包蒙吉。纳妇吉。子克家。', + '六三:勿用取女,见金夫,不有躬,无攸利。', + '六四:困蒙,吝。', + '六五:童蒙,吉。', + '上九:击蒙,不利为寇,利御寇。', + ], + }, + '7,7': { // 艮为山 + yaoCi: [ + '初六:艮其趾,无咎,利永贞。', + '六二:艮其腓,不拯其随,其心不快。', + '九三:艮其限,列其夤,厉薰心。', + '六四:艮其身,无咎。', + '六五:艮其辅,言有序,悔亡。', + '上九:敦艮,吉。', + ], + }, + '7,8': { // 山地剥 + yaoCi: [ + '初六:剥床以足,蔑贞凶。', + '六二:剥床以辨,蔑贞凶。', + '六三:剥之,无咎。', + '六四:剥床以肤,凶。', + '六五:贯鱼以宫人宠,无不利。', + '上九:硕果不食,君子得舆,小人剥庐。', + ], + }, + + // ── 坤宫 ── + '8,1': { // 地天泰 + yaoCi: [ + '初九:拔茅茹以其汇,征吉。', + '九二:包荒,用冯河,不遐遗,朋亡,得尚于中行。', + '九三:无平不陂,无往不复。艰贞无咎,勿恤其孚,于食有福。', + '六四:翩翩,不富以其邻,不戒以孚。', + '六五:帝乙归妹,以祉元吉。', + '上六:城复于隍,勿用师。自邑告命,贞吝。', + ], + }, + '8,2': { // 地泽临 + yaoCi: [ + '初九:咸临,贞吉。', + '九二:咸临,吉,无不利。', + '六三:甘临,无攸利。既忧之,无咎。', + '六四:至临,无咎。', + '六五:知临,大君之宜,吉。', + '上六:敦临,吉,无咎。', + ], + }, + '8,3': { // 地火明夷 + yaoCi: [ + '初九:明夷于飞,垂其翼。君子于行,三日不食,有攸往,主人有言。', + '六二:明夷,夷于左股,用拯马壮,吉。', + '九三:明夷于南狩,得其大首,不可疾贞。', + '六四:入于左腹,获明夷之心,出于门庭。', + '六五:箕子之明夷,利贞。', + '上六:不明晦,初登于天,后入于地。', + ], + }, + '8,4': { // 地雷复 + yaoCi: [ + '初九:不远复,无祗悔,元吉。', + '六二:休复,吉。', + '六三:频复,厉,无咎。', + '六四:中行独复。', + '六五:敦复,无悔。', + '上六:迷复,凶,有灾眚。用行师,终有大败。以其国君凶,至于十年不克征。', + ], + }, + '8,5': { // 地风升 + yaoCi: [ + '初六:允升,大吉。', + '九二:孚乃利用禴,无咎。', + '九三:升虚邑。', + '六四:王用亨于岐山,吉,无咎。', + '六五:贞吉,升阶。', + '上六:冥升,利于不息之贞。', + ], + }, + '8,6': { // 地水师 + yaoCi: [ + '初六:师出以律,否臧凶。', + '九二:在师中吉,无咎,王三锡命。', + '六三:师或舆尸,凶。', + '六四:师左次,无咎。', + '六五:田有禽,利执言,无咎。长子帅师,弟子舆尸,贞凶。', + '上六:大君有命,开国承家,小人勿用。', + ], + }, + '8,7': { // 地山谦 + yaoCi: [ + '初六:谦谦君子,用涉大川,吉。', + '六二:鸣谦,贞吉。', + '九三:劳谦,君子有终,吉。', + '六四:无不利,撝谦。', + '六五:不富以其邻,利用侵伐,无不利。', + '上六:鸣谦,利用行师征邑国。', + ], + }, + '8,8': { // 坤为地 + yaoCi: [ + '初六:履霜,坚冰至。', + '六二:直方大,不习无不利。', + '六三:含章可贞,或从王事,无成有终。', + '六四:括囊,无咎无誉。', + '六五:黄裳,元吉。', + '上六:龙战于野,其血玄黄。', + ], + yongCi: '用六:利永贞。', + }, +}; + +/** + * 获取64卦的传统文本(爻辞 + 用辞) + * @param upperNum 上卦先天数 1-8 + * @param lowerNum 下卦先天数 1-8 + */ +export function getTraditionalText(upperNum: number, lowerNum: number): TraditionalText | null { + return TEXTS[`${upperNum},${lowerNum}`] ?? null; +}