CoLF Logic Programming as Infinitary Proof Exploration
Chen, Pfenning
Logical Frameworks such as Automath [de Bruijn, 1968] or LF [Harper et al., 1993] were originally conceived as metalanguages for the specification of foundationally uncommitted deductive systems, yielding generic proof checkers. Their high level of abstraction was soon exploited to also express algorithms over deductive systems such as theorem provers, type-checkers, evaluators, compilers, proof transformers, etc. in the paradigm of computation-as-proof-construction. This has been realized in languages such as $λ$-Prolog [Miller et al., 1991] or Elf [Pfenning, 1991] based on backward chaining, and LolliMon [Lopez et al., 2005] or Celf [Schack-Nielsen and Schuermann, 2008], which integrated forward chaining. None of these early frameworks supported the direct expression of infinitary objects or proofs, which are available in the recently developed CoLF$^Ï$ [Chen, 2023]. In this work-in-progress report, we sketch an approach to computation-as-proof-construction over the first-order fragment of CoLF$^Ï$ (called CoLF$^Ï_1$ ) that already includes infinitary objects and proofs. A key idea is the interpretation of logic variables as communication channels and computation as concurrent message-passing. This is realized in a concrete compiler from CoLF$^Ï_1$ to Sax, a proof-theoretically inspired parallel programming language based on the proof-reduction in the semi-axiomatic sequent calculus [DeYoung et al., 2020].
academic
Programación Lógica CoLF como Exploración de Pruebas Infinitarias
Este artículo explora métodos para implementar el paradigma "computación como construcción de pruebas" en el fragmento de primer orden de CoLF^ω (CoLF^ω_1), que ya contiene objetos infinitos y pruebas. La idea central es interpretar variables lógicas como canales de comunicación e interpretar la computación como paso de mensajes concurrente. Esta idea se materializa mediante una implementación concreta de compilador que traduce CoLF^ω_1 a Sax, un lenguaje de programación paralelo inspirado en la teoría de pruebas basado en reducción de pruebas en cálculo de secuentes semi-axiomatizado.
Limitaciones de marcos lógicos tradicionales: Marcos lógicos tempranos como Automath y LF, aunque implementaron exitosamente el paradigma "computación como construcción de pruebas", no soportaban la expresión directa de objetos infinitos o pruebas
Problemas de implementaciones existentes: La búsqueda de pruebas basada en retroceso enfrenta múltiples dificultades en configuraciones infinitas:
Problemas de terminación cuando la entrada es infinita
Problemas de interacción entre objetos infinitos y retroceso (posiblemente nunca falle explícitamente)
Los algoritmos de unificación solo garantizan terminación en términos racionales (cíclicos), pero muchos objetos o pruebas en aplicaciones no son racionales
Soportar computación infinita: Se necesita una semántica dinámica que pueda computar incrementalmente la salida a partir de la entrada, similar a transformadores entre flujos
Evitar retroceso: Garantizar estáticamente mediante patrones y verificación de unicidad que exista como máximo una prueba para cada entrada única
Paralelización: Explotar paralelismo-y entre múltiples premisas mediante comunicación entre variables compartidas
Propuesta del lenguaje de programación lógica CoLF^ω_1: Soporta pruebas con representación de términos infinitos, construcción de pruebas sin retroceso, evaluación paralela de premisas mediante variables lógicas compartidas para comunicación
Modelo de computación innovador: Interpreta variables lógicas como canales de comunicación e interpreta la computación como paso de mensajes concurrente
Implementación de compilador: Compilador concreto de CoLF^ω_1 a Sax
Sistema de ejemplos enriquecido: Incluye implementaciones de procesamiento de flujos, secuencia de Fibonacci, operaciones de integración y otras relaciones complejas
El comportamiento del programa se define mediante las siguientes operaciones:
Operaciones de canal: Cada parámetro se considera un canal de comunicación, con declaraciones de modo especificando canales de entrada (+) o salida (-)
Operaciones de lectura/escritura: El programa puede leer valores de canales de entrada y escribir valores en canales de salida
Reenvío de canal: Reenviar directamente un canal de entrada a un canal de salida
Generación paralela: Asignar nuevos canales y generar nuevos procesos
Mediante verificación estática de unicidad se garantiza que en cada punto del programa existe como máximo una acción posible, eliminando la necesidad de retroceso en programación lógica tradicional.
mult_s : mult A B C -> add B C D -> mult (s A) B D.
En la definición anterior de multiplicación, las dos premisas mult A B C y add B C D pueden evaluarse en paralelo, comunicándose a través de la variable compartida C.
Soporta evaluación perezosa; cuando la salida D se revela gradualmente, los primeros B pasos no necesitan evaluar mult A B C porque C permanece sin cambios.
omega : conat = s omega.
main : stream = repeat omega.
Resultado:
(cons (s (s (s (s ...))))
(cons (s (s (s ...)))
(cons (s (s ...))
(cons (s ...)
(cons ...)))))
El artículo cita literatura importante en campos de marcos lógicos, teoría de pruebas y computación paralela, incluyendo:
Sistema Automath de de Bruijn
Marco LF de Harper et al.
λ-Prolog de Miller et al.
Cálculo de secuentes semi-axiomatizado de DeYoung et al.
Evaluación General: Este es un artículo innovador de ciencia de la computación teórica que introduce por primera vez soporte de objetos infinitos en marcos lógicos, proponiendo un modelo de computación concurrente novedoso. Aunque como informe de progreso aún hay espacio para mejorar la profundidad teórica, sus ideas centrales e implementación preliminar abren nuevas direcciones de investigación en este campo.