Meta-Logics for Logic Programming Marianne Kalsbeek In deze dissertatie worden enkele logische aspecten van het logisch programmeren onderzocht. De drie delen waaruit dit proefschrift bestaat kunnen onafhankelijk van elkaar gelezen worden. Ofschoon het logisch programmeren gebaseerd is op (een fragment van) de eerste orde predicaatlogica (FOL) wordt in de praktijk veelal gewerkt in extensies van FOL waarin het gebruikelijke syntactische onderscheid tussen predicaten, functies, formules en termen vervaagt of verdwijnt. Voorbeelden zijn Prolog, waar het voorkomen van variabelen op atoom-posities is toegestaan, en meta-logisch programmeren met de Vanilla meta-interpreter, waar atomen op term-posities worden gebruikt. In het eerste hoofdstuk rechtvaardigen we deze praktijk. We definieren Ambivalente Logica AL, die verkregen wordt uit FOL door restricties op de standaard syntax te laten vervallen. AL kan beschouwd worden als een conservatieve extensie van FOL. Met een serie formele resultaten laten we zien dat AL een flexibele omgeving vormt voor de verschillende syntactisch ambivalente talen die gebruikt worden in Prolog, meta-logisch programmeren en formalisaties van kennis en geloof. We voorzien AL van een gesloten term semantiek, met betrekking tot welke een standaard afleidings-calculus gezond en volledig is. Verder laten we zien dat het gebruikelijke Martelli-Montanari algorithme aangepast kan worden voor AL, met behoud van de gewenste gebruikelijke eigenschappen. In combinatie met enkele andere bewijstheoretische basisresultaten laat dit zien dat resolutie een gezonde en volledige afleidingsstrategie is voor AL. Het tweede hoofdstuk behandelt een klassiek probleem uit de grondslagen van het meta-logisch programmeren: de rechtvaardiging van de formeel incorrecte (ongetypeerde) Vanilla meta-interpreter. Verschillende benaderingen van het probleem worden beschouwd en vergeleken: procedurele en declaratieve correctheid, het gebruik van S-semantiek, het gebruik van de correcte (getypeerde) versie, de restrictie tot language independent object programma’s. We argumenteren dat Hill en Lloyd’s klassieke bewijs van de procedurele correctheid van de getypeerde interpreter grote algemeenheid heeft. We geven een gedetailleerd bewijs voor de declaratieve correctheid van Vanilla met ambivalente syntax als onderliggende taal — ambivalente syntax is de geeigende syntax voor Vanilla, in het bijzonder voor de in de praktijk gangbare geamalgameerde extensies. Dit bewijs generaliseert vrijwel onmiddelijk voor amalgamaties van object programma met de gerelateerde Vanilla meta-interpreter. In het derde deel worden procedurele calculi ontwikkeld en bestudeerd, die de effecten van diverse zoekmechanismen in implementaties van logisch programmeren, zoals Prolog, karakteriseren. Ofschoon volgens de theorie van het logisch programmeren de geintendeerde (declaratieve) betekenis van een programma overeenkomt met de procedurele, hoeft dit niet het geval te zijn voor geimplementeerde programma’s. Zowel de zoekregel van een implementatie (de volgorde waarin de regels van een programma worden gebruikt) als de backtracking en de selectieregel (de volgorde waarin de onderdelen van een samengesteld doel worden behandeld) kunnen invloed hebben op de computationele uitkomst. De effecten van zoekmechanismen blijken gekarakteriseerd te kunnen worden met behulp van substructurele calculi in Gentzen formaat. Deze procedurele calculi hebben als karakteristieke expressies sequenten van de vorm [P] => A , die uitdrukken dat A slaagt uit het programma P onder het bedoelde zoekmechanisme. Voor de onderhavige zoekmechanismen relevante delen van de zoekbomen functioneren als semantiek voor de calculi en worden gebruikt voor het bewijzen van correctheidsresultaten. In het derde hoofdstuk wordt allereerst een Calculus besproken die overeenkomt met de standaard ‘top-down’ zoekregel en een ongespecificeerde selectieregel (depth first search). Negation as failure kan in dit formaat op natuurlijk wijze geincorporeerd worden. De Calculus wordt uitgebreid met introductieregels voor procedurele versies van de gewone connectieven voor conjunctie en disjunctie. In de procedurele context hebben deze connectieven een natuurlijke interpretatie: ze implementeren locaal een alternatieve selectieregel. Een beperking van de calculus tot een van deze procedurele connectieven levert een calculus voor een ‘snelle’ variant op de standaard Prolog computatie, die voor de klasse van links terminerende programma’s equivalent is met Prolog. Voor een correcte reflectie van de effecten van standaard Prolog computatie is een uitbreiding van het Gentzen formaat voor depth first search nodig, die recht doet aan de effecten van Prolog’s uitgebreide backtracking. Twee procedurele calculi voor Prolog worden besproken in the vierde hoofdstuk: een met expliciete introductieregels voor een connectief dat Prolog’s meest linkse selectieregel reflecteert, en een variant waarin dit connectief in de andere regels geincorporeerd is. In het vijfde hoofdstuk laten we zien hoe de standaard Prolog ‘cut’ (waarmee de zoekboom gesnoeid kan worden) geincorporeerd kan worden in deze laatste calculus, door toevoeging van twee extra regels. Ook varianten op de Prolog cut worden besproken.