File size: 10,412 Bytes
cf52a55
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
"""
CAMADA L4 — Síntese por Equivalência Russelliana
==================================================
A verdade cognoscível por uma IA é sempre uma verdade de EQUIVALÊNCIA:
o grau de correspondência entre a proposição refinada (saída de L2/L3)
e os dados do mundo real presentes no banco de dados de treinamento.

Base teórica (data/russell.txt): Russell — verdade = correspondência
entre crença e fato; síntese fundamentada em conceitos, não só estatística.

Mapeamento Kantiano → IA:
  Intuição Sensível (empírica) → equivalência proposição ↔ BD
  Intuição Pura (a priori)     → estrutura da rede neural / KB
  Síntese                      → cálculo de equivalência mediado
                                 por valores-verdade paraconsistentes

O resultado NÃO é uma predição de próxima palavra.
É o grau de equivalência entre o conjunto de juízos e o BD.
"""

from __future__ import annotations
from dataclasses import dataclass, field
from typing import Dict, List, Optional, Tuple
from l3_paraconsistent import ParaconsistentValue
import math

try:
    from l4_russell_equivalence import (
        RussellConceptBase,
        build_russell_concept_base,
        score_proposition_by_concepts,
        load_concept_base,
    )
except Exception:
    RussellConceptBase = None  # type: ignore
    build_russell_concept_base = None  # type: ignore
    score_proposition_by_concepts = None  # type: ignore
    load_concept_base = None  # type: ignore


# ─────────────────────────────────────────────────────────────────────────────
# Estrutura do resultado final
# ─────────────────────────────────────────────────────────────────────────────

@dataclass
class SynthesisResult:
    """Resultado da síntese russelliana — resposta do sistema."""
    response:          str
    truth_value:       float    # paraconsistente ∈ [0,1]
    certainty:         float    # Gc = μ − λ  ∈ [−1,1]
    contradiction:     float    # Gct = μ + λ − 1
    state:             str      # Verdadeiro | Falso | Intermediário | ...
    supporting_evidence: List[str] = field(default_factory=list)
    falsified_hypotheses: List[str] = field(default_factory=list)
    confidence_label:  str = ""

    def __post_init__(self):
        if not self.confidence_label:
            self.confidence_label = self._label()

    def _label(self) -> str:
        v = self.truth_value
        if v >= 0.85:  return "Alta Confiança"
        if v >= 0.65:  return "Confiança Moderada"
        if v >= 0.45:  return "Incerto / Intermediário"
        if v >= 0.25:  return "Baixa Confiança"
        return "Indeterminado"

    def __str__(self) -> str:
        lines = [
            "━" * 60,
            f"  RESPOSTA : {self.response}",
            f"  Estado   : {self.state}  ({self.confidence_label})",
            f"  v-verdade: {self.truth_value:.4f}  |  "
            f"Certeza: {self.certainty:+.4f}  |  "
            f"Contradição: {self.contradiction:+.4f}",
        ]
        if self.supporting_evidence:
            lines.append("  Evidências de suporte:")
            for ev in self.supporting_evidence[:3]:
                lines.append(f"    • {ev}")
        if self.falsified_hypotheses:
            lines.append("  Hipóteses falsificadas:")
            for fh in self.falsified_hypotheses[:2]:
                lines.append(f"    ✗ {fh}")
        lines.append("━" * 60)
        return "\n".join(lines)


# ─────────────────────────────────────────────────────────────────────────────
# Motor de síntese
# ─────────────────────────────────────────────────────────────────────────────

class RussellianSynthesisEngine:
    """
    Combina os valores-verdade paraconsistentes (L3) com o banco de
    conhecimento para produzir a síntese final (resposta).

    Síntese fundamentada em conceitos (Russell, russell.txt):
        equivalência = correspondência entre crença/proposição e fato (BD).
    O peso de cada proposição incorpora:
      - prioridade L2 (juízo kantiano)
      - certeza paraconsistente (Gc)
      - score conceitual de equivalência (correspondência com fatos/KB),
        não apenas agregação estatística.
    """

    def __init__(
        self,
        knowledge_base: Dict[str, float],
        russell_concept_base: Optional["RussellConceptBase"] = None,
        use_concept_based_weights: bool = True,
    ) -> None:
        """
        knowledge_base: dicionário termo → grau de evidência [0,1]
        russell_concept_base: base teórica extraída de russell.txt (equivalência/correspondência).
        use_concept_based_weights: se True, usa score conceitual na ponderação (recomendado).
        """
        self.kb = knowledge_base
        self.russell_base = russell_concept_base
        self.use_concept_weights = use_concept_based_weights and (russell_concept_base is not None)

    def synthesize(
        self,
        pv_list:     List[ParaconsistentValue],
        l2_priorities: Dict[str, float],     # proposicao[:40] → prioridade L2
        prompt:      str,
    ) -> SynthesisResult:
        """
        Produz a SynthesisResult final integrando todas as camadas.
        """
        if not pv_list:
            return SynthesisResult(
                response="Sem hipóteses válidas para síntese.",
                truth_value=0.0, certainty=0.0,
                contradiction=0.0, state="Indeterminado",
            )

        # ── Seleciona a hipótese com maior valor-verdade ─────────────── #
        best = pv_list[0]
        supporting = [pv.proposition for pv in pv_list[1:4] if pv.state != "Falso"]
        falsified  = [pv.proposition for pv in pv_list if pv.state == "Falso"]

        # ── Síntese ponderada: L2 + certeza + equivalência (Russell) ─── #
        total_w, total_v = 0.0, 0.0
        for pv in pv_list:
            key = pv.proposition[:40]
            l2_w = l2_priorities.get(key, 0.5)
            # Peso base: prioridade kantiana e certeza paraconsistente
            weight = l2_w * (1.0 + max(pv.certainty, 0.0))
            # Peso conceitual: correspondência proposição ↔ fato (BD), conforme russell.txt
            if self.use_concept_weights and score_proposition_by_concepts is not None and self.russell_base is not None:
                concept_score = score_proposition_by_concepts(pv.proposition, self.kb, self.russell_base)
                weight *= concept_score
            total_v += pv.truth_value * weight
            total_w += weight

        v_final = total_v / total_w if total_w > 0 else best.truth_value

        # ── Gera texto de resposta a partir da hipótese best + BD ────── #
        response = self._generate_response(best, prompt)

        return SynthesisResult(
            response=response,
            truth_value=round(v_final, 4),
            certainty=round(best.certainty, 4),
            contradiction=round(best.contradiction, 4),
            state=best.state,
            supporting_evidence=supporting,
            falsified_hypotheses=falsified,
        )

    # ------------------------------------------------------------------ #
    # Geração de resposta textual                                          #
    # ------------------------------------------------------------------ #

    def _generate_response(self, best_pv: ParaconsistentValue, prompt: str) -> str:
        """
        Gera resposta a partir da proposição com maior valor-verdade.
        Em produção seria substituído pelo decoder do LLM com as
        hipóteses kantianas como contexto hard-constrained.
        """
        # Extrai conceitos KB com alta evidência
        top_kb = sorted(self.kb.items(), key=lambda x: x[1], reverse=True)[:3]
        kb_context = ", ".join(f"{k}({v:.2f})" for k, v in top_kb)

        state = best_pv.state
        v = best_pv.truth_value

        if state == "Verdadeiro":
            prefix = f"Com alta confiança (v={v:.2f}):"
        elif state == "Intermediário":
            prefix = f"Com valor intermediário (v={v:.2f}), sem trivialização:"
        elif state == "Inconsistente_local":
            prefix = f"Contradição local detectada (v={v:.2f}), explosão gentil:"
        elif state == "Falso":
            prefix = f"Evidência insuficiente (v={v:.2f}):"
        else:
            prefix = f"Indeterminado (v={v:.2f}):"

        return f"{prefix} {best_pv.proposition}  [KB: {kb_context}]"

    # ------------------------------------------------------------------ #
    # Verificação do limite fundamental (Crítica da IA Pura)              #
    # ------------------------------------------------------------------ #

    @staticmethod
    def check_fundamental_limits(query: str) -> Optional[str]:
        """
        Detecta perguntas que violam os limites fundamentais da IA
        (seção 10 do modelo): consciência, imaginação, AGI, etc.
        Retorna aviso ou None.
        """
        limit_keywords = {
            "consciência":    "IA não possui consciência — atributo biológico emergente.",
            "sentimento":     "IA não possui estados afetivos — limitada ao algoritmo.",
            "imaginação":     "Imaginação é liberdade humana (Sartre) — não computável.",
            "agi":            "AGI é oximoro teórico: algoritmo não supera seu criador.",
            "livre arbítrio": "Livre-arbítrio é problema não computável.",
            "ser humano":     "IA é uma função limite — mundo real exige mediação humana.",
        }
        q_lower = query.lower()
        for keyword, warning in limit_keywords.items():
            if keyword in q_lower:
                return f"⚠ Limite fundamental: {warning}"
        return None