zyql / index.html
Reginaldo5's picture
ZYQL trivalent kernel demo — static live page (BigInt exact, 6/6 tested)
0d9eb0a
Raw History Blame Contribute Delete
13.3 kB
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>ZYQL — Trivalent Quantum Language</title>
<style>
:root{
--bg:#0b0e14;--card:#121722;--border:#232b3d;--ink:#e6e9f2;--mut:#8b93a8;
--acc:#7c6cff;--ok:#3ddc97;--no:#ff6b6b;--ref:#ffb454;--unk:#8b93a8;
}
*{box-sizing:border-box;margin:0;padding:0}
body{background:var(--bg);color:var(--ink);font:15px/1.55 ui-monospace,'Cascadia Mono',Menlo,Consolas,monospace;padding:28px 18px 60px}
.wrap{max-width:880px;margin:0 auto}
h1{font-size:1.5rem;letter-spacing:.5px}
h1 .sig{color:var(--acc)}
.sub{color:var(--mut);margin:6px 0 22px}
.sub a{color:var(--acc);text-decoration:none}
.katas{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:10px;margin-bottom:18px}
.k{background:var(--card);border:1px solid var(--border);border-radius:10px;padding:12px 14px;text-align:left;color:var(--ink);cursor:pointer;font:inherit;transition:border-color .15s}
.k:hover{border-color:var(--acc)}
.k b{display:block;color:var(--acc);font-size:.82rem;margin-bottom:3px}
.k span{font-size:.78rem;color:var(--mut)}
.panel{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:16px}
.panel h2{font-size:.8rem;color:var(--mut);font-weight:600;text-transform:uppercase;letter-spacing:1px;margin-bottom:10px}
textarea{width:100%;background:var(--bg);color:var(--ink);border:1px solid var(--border);border-radius:8px;padding:10px;font:12px/1.5 ui-monospace,monospace;min-height:150px;resize:vertical}
textarea:focus{outline:1px solid var(--acc)}
.go{margin-top:10px;background:var(--acc);color:#fff;border:none;border-radius:8px;padding:10px 22px;font:inherit;font-weight:700;cursor:pointer}
.go:hover{filter:brightness(1.1)}
.verdict{display:flex;align-items:center;gap:16px;margin:16px 0 10px}
.badge{font-size:2.2rem;font-weight:800;padding:8px 26px;border-radius:12px;border:2px solid}
.v1{color:var(--ok);border-color:var(--ok);background:rgba(61,220,151,.07)}
.v0{color:var(--no);border-color:var(--no);background:rgba(255,107,107,.07)}
.vREF{color:var(--ref);border-color:var(--ref);background:rgba(255,180,84,.07)}
.vUNK{color:var(--unk);border-color:var(--unk);background:rgba(139,147,168,.07)}
.vmeta{font-size:.85rem;color:var(--mut)}
.vmeta b{color:var(--ink)}
.ev{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:12px;white-space:pre-wrap;font-size:.78rem;color:var(--mut);max-height:340px;overflow:auto}
.ev b{color:var(--ink)}
footer{margin-top:26px;color:var(--mut);font-size:.74rem;line-height:1.7}
footer a{color:var(--acc);text-decoration:none}
.err{color:var(--ref)}
</style>
</head>
<body>
<div class="wrap">
<h1><span class="sig">&#8488;</span> ZYQL &mdash; Trivalent Quantum Language</h1>
<p class="sub">O LLM prop&otilde;e. O conhecimento fundamenta. O <b>ZYQL decide</b>. ASK FIRST. PROVE NEXT. COMPUTE LAST.<br>
Kernel trivalente <b>1 / 0 / REFUSED</b> rodando exato no seu navegador &middot;
<a href="https://github.com/SerenaSolutions/zephirum">reposit&oacute;rio</a> &middot;
DOI <a href="https://doi.org/10.5281/zenodo.23330695">10.5281/zenodo.23330695</a> &middot;
jobs reais IBM Quantum <span style="color:var(--ok)">ibm_fez</span></p>
<div class="katas" id="katas"></div>
<div class="panel">
<h2>Programa ZYQL (JSON) &mdash; decida sem executar &nbsp;<span style="color:var(--ref)">(inteiros &gt; 2&sup3;&sup3;: use aspas, ex. "31557600000000000")</span></h2>
<textarea id="prog" spellcheck="false"></textarea>
<button class="go" id="go">ASK &#10230; DECIDE</button>
<div id="out"></div>
</div>
<footer>
Kernel demo: port JS exato (BigInt) de um subconjunto auditado do n&uacute;cleo ZEPHIRUM &mdash; fam&iacute;lias
threshold_sum (elimina&ccedil;&atilde;o por cotas), geometric_series (forma fechada) e entanglement sparse(&le;64)
(posto-1 por menores 2&times;2 em todos os cortes, fra&ccedil;&otilde;es exatas). O motor completo (Python + C,
verificador independente, recibos ML-DSA-44) vive no reposit&oacute;rio, com a suite cient&iacute;fica no CI.
Estados honestos: UNKNOWN n&atilde;o &eacute; palpite; REFUSED n&atilde;o &eacute; derrota &eacute; disciplina (&sect;12).
Autor: Reginaldo Pinezi Uhlmann
(<a href="https://orcid.org/0009-0005-3212-5179">ORCID 0009-0005-3212-5179</a>).
Este certificado de demonstra&ccedil;&atilde;o prova integridade da decis&atilde;o exibida; a assinatura ML-DSA-44 real est&aacute; nos recibos do reposit&oacute;rio.
</footer>
</div>
<script>
"use strict";
/* ---------- aritmética exata: frações BigInt ---------- */
const F = (n, d=1n) => (d<0n?[-n,-d]:[n,d]);
const fmul=(a,b)=>[a[0]*b[0], a[1]*b[1]];
const fsub=(a,b)=>[a[0]*b[1]-b[0]*a[1], a[1]*b[1]];
const fcmp0=a=>a[0]===0n?0:(a[0]>0?1:-1);
const feq=(a,b)=>a[0]*b[1]===b[0]*a[1];
const fstr=a=>a[1]===1n?`${a[0]}`:`${a[0]}/${a[1]}`;
/* ---------- famílias do kernel (port do núcleo auditado) ---------- */
function thresholdSum(m){
const terms=m.terms.map(t=>F(BigInt(String(t))));
let k=0n; for(const t of terms) k+=t[0]*t[1];
const u=(m.unknown_lo!==undefined)?{lo:BigInt(String(m.unknown_lo)),hi:BigInt(String(m.unknown_hi)),n:BigInt(String(m.n_unknown||1))}:null;
const thr=F(BigInt(m.threshold));
if(u){
const min=k+u.lo*u.n, max=k+u.hi*u.n;
const units=u.n;
if(min>thr[0]) return {verdict:"1",status:"DECIDED_WITHOUT_EXECUTION",kernel:"BOUNDS_ELIMINATION",
eliminated:units,original:units,ev:{min_sum:`${min}`,max_sum:`${max}`,rule:"min > threshold (nenhum termo executado)"}};
if(max<thr[0]) return {verdict:"0",status:"DECIDED_WITHOUT_EXECUTION",kernel:"BOUNDS_ELIMINATION",
eliminated:units,original:units,ev:{min_sum:`${min}`,max_sum:`${max}`,rule:"max < threshold (nenhum termo executado)"}};
return {verdict:"UNKNOWN",status:"UNKNOWN",kernel:"NONE",eliminated:0n,original:units,
ev:{min_sum:`${min}`,max_sum:`${max}`,rule:"cotas não decidem a questão — sem palpite"}};
}
const s=F(k,1n);
const v=feq(s,thr)?0:(fcmp0(fsub(s,thr))>0?1:-1);
const op=m.op||">";
const ok=(op===">"&&v>0)||(op==="<="&&v<=0)||(op===">="&&v>=0)||(op==="<"&&v<0);
return {verdict:ok?"1":"0",status:"FULL_EXECUTION_REQUIRED",kernel:"FULL_SUM",
eliminated:0n,original:BigInt(m.terms.length),ev:{full_sum:`${k}`}};
}
function geometricSeries(m){
const r=BigInt(String(m.r)), n=BigInt(String(m.n));
const closed = r===1n ? n+1n : (r**(n+1n)-1n)/(r-1n); // r≠1 exige r pequeno (limite prático do navegador)
const thr=BigInt(String(m.threshold));
const v = closed>thr?1:-1;
const op=m.op||">";
const ok=(op===">"&&closed>thr)||(op==="<="&&closed<=thr)||(op===">="&&closed>=thr)||(op==="<"&&closed<thr);
// baseline honesta: 1e9 adicoes/s
const anos=Number(n+1n)/1e9/31557600;
return {verdict:ok?"1":"0",status:"DECIDED_WITHOUT_EXECUTION",kernel:"GEOMETRIC_CLOSED_FORM",
eliminated:n+1n,original:n+1n,
ev:{closed_form:`${closed}`,naive_estimate: anos>=1?`execucao completa ≈ ${anos>=100?Math.round(anos)+" ANOS":anos.toFixed(1)+" anos"}`:`execucao completa ≈ ${(Number(n+1n)/1e9).toFixed(1)} s`,
rule:"forma fechada — nenhuma adicao executada"}};
}
function entangleSparse(m){
const N=Number(m.n);
if(!(N>=1&&N<=64)) return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",eliminated:0n,original:0n,
ev:{reason:"sparse(N): N = 1..64 (espaco declarado)"}};
if(m.entries.length===0) return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",eliminated:0n,original:0n,
ev:{reason:"zero state is not a quantum state"}};
const ents=m.entries.map(e=>[BigInt(String(e[0])),F(BigInt(String(e[1])),e[2]?BigInt(String(e[2])):1n)]);
for(const e of ents) if(e[0]>=(1n<<BigInt(N))) return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",
eliminated:0n,original:0n,ev:{reason:"indice alem do espaco 2^N"}};
// posto-1 por menores 2x2 em TODOS os cortes k | N-k (rota independente, exata)
let separable=true, corteGuilty=0;
const M=new Map(ents.map(([i,a])=>[i.toString(),a]));
for(let k=1;k<N&&separable;k++){
const lo=BigInt(N-k);
for(let x=0;x<ents.length&&separable;x++)
for(let y=x+1;y<ents.length&&separable;y++){
const [i1,a1]=ents[x],[i2,a2]=ents[y];
const r1=i1>>lo,c1=i1&((1n<<lo)-1n),r2=i2>>lo,c2=i2&((1n<<lo)-1n);
if(r1===r2||c1===c2) continue;
const key=(r,c)=>((r<<lo)|c).toString();
const B=M.get(key(r1,c2))||[0n,1n]; // M[r1,c2] ausente => 0
const C=M.get(key(r2,c1))||[0n,1n]; // M[r2,c1] ausente => 0
const minor=fsub(fmul(a1,a2),fmul(B,C)); // menor 2x2 das linhas r1,r2 e colunas c1,c2
if(fcmp0(minor)!==0){separable=false;corteGuilty=k;}
}
}
const ent=!separable;
const naive=(2n**BigInt(N)); // amplitudes
return {verdict:ent?"1":"0",status:"DECIDED_WITHOUT_EXECUTION",kernel:"SPARSE_RANK1_MINORS",
eliminated:naive,original:naive,
ev:{n_qubits:N,support:ents.length,fully_separable:!ent,
cut_found:corteGuilty?("posto 2 no corte q"+corteGuilty+"|"+(N-corteGuilty)):"posto 1 em todos os cortes",
naive_note:`execucao completa = 2^${N} = ${naive.toString().slice(0,15)}${naive>10n**15n?"…":""} amplitudes`}};
}
function decide(p){
try{
if(!p.model||!p.model.type) return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",eliminated:0n,original:0n,ev:{reason:"programa sem MODEL.type — portã de proposito recusa"}};
const t=p.model.type;
if(t==="threshold_sum") return thresholdSum(p.model);
if(t==="geometric_series") return geometricSeries(p.model);
if(t==="entanglement") return entangleSparse(p.model);
return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",eliminated:0n,original:0n,
ev:{reason:`familia '${t}' fora do kernel demo — motor completo no repositorio`}};
}catch(e){
return {verdict:"REFUSED",status:"REFUSED",kernel:"NONE",eliminated:0n,original:0n,
ev:{reason:"programa malformado: "+e.message}};
}
}
/* ---------- certificado sha256 ---------- */
async function certHash(obj){
const canon=JSON.stringify(obj);
const buf=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(canon));
return [...new Uint8Array(buf)].map(b=>b.toString(16).padStart(2,"0")).join("");
}
/* ---------- katas ---------- */
const KATAS=[
{name:"A soma de 100 anos",desc:"31,5 quadrilhões de adições decididas sem somar uma",
prog:{question:"sum > 20.000.000.000.000.000 ?",model:{type:"geometric_series",r:"1",n:"31557600000000000",threshold:"20000000000000000",op:">"}}},
{name:"Eliminação por cotas",desc:"unknown em faixa 0..9 decidido por eliminação de min/max",
prog:{question:"sum > 50 ?",model:{type:"threshold_sum",terms:[60,30,20,5],unknown_lo:0,unknown_hi:9,n_unknown:1,threshold:50,op:">"}}},
{name:"UNKNOWN honesto",desc:"as cotas não decidem — o kernel devolve UNKNOWN, não palpite",
prog:{question:"sum > 80 ?",model:{type:"threshold_sum",terms:[60,15],unknown_lo:0,unknown_hi:9,n_unknown:1,threshold:80,op:">"}}},
{name:"Emaranhado 64 qubits",desc:"2^64 amplitudes = séculos; posto-1 decide em milissegundos",
prog:{question:"entangled == 1 ?",model:{type:"entanglement",n:64,entries:[["0","3"],["18446744073709551615","5"]]}}},
{name:"Estado produto",desc:"posto 1 em todos os cortes: veredito 0 (separável)",
prog:{question:"entangled == 1 ?",model:{type:"entanglement",n:20,entries:[[0,7],[1,5]]}}},
{name:"REFUSED (§12)",desc:"índice fora do espaço declarado: recusa com motivo",
prog:{question:"entangled == 1 ?",model:{type:"entanglement",n:4,entries:[[999,1]]}}}
];
const $=id=>document.getElementById(id);
function renderKatas(){
$("katas").innerHTML=KATAS.map((k,i)=>
`<button class="k" data-i="${i}"><b>${k.name}</b><span>${k.desc}</span></button>`).join("");
[...document.querySelectorAll(".k")].forEach(b=>b.onclick=()=>{
$("prog").value=JSON.stringify(KATAS[+b.dataset.i].prog,null,2);
run();
});
}
async function run(){
const out=$("out");
let p;
try{p=JSON.parse($("prog").value);}catch(e){out.innerHTML=`<div class="verdict"><div class="badge vREF">REFUSED</div><div class="vmeta err">JSON malformado: ${e.message}</div></div>`;return;}
const t0=performance.now();
const r=decide(p);
const dt=(performance.now()-t0).toFixed(2);
const ch=await certHash({program:p,decision:r});
const cls=r.verdict==="1"?"v1":r.verdict==="0"?"v0":r.verdict==="REFUSED"?"vREF":"vUNK";
const el=(r.eliminated>0n||r.eliminated>0)?`eliminadas <b>${BigInt(r.eliminated).toLocaleString("pt-BR")}</b> de ${BigInt(r.original).toLocaleString("pt-BR")} unidades (${(100*Number(r.eliminated)/Number(r.original||1)).toFixed(1)}%)`:"eliminação: n/a";
out.innerHTML=`<div class="verdict"><div class="badge ${cls}">${r.verdict}</div>
<div class="vmeta">status: <b>${r.status}</b><br>kernel: <b>${r.kernel}</b><br>decidido em <b>${dt} ms</b><br>${el}</div></div>
<div class="ev"><b>certificate sha256</b>: ${ch.slice(0,32)}…<br><br>${JSON.stringify(r.ev,null,1)}</div>`;
}
$("go").onclick=run;
renderKatas();
$("prog").value=JSON.stringify(KATAS[0].prog,null,2);
</script>
</body>
</html>