ProDebug: An Automated Debugging System for Prolog
Carnegie Mellon University(卡内基梅隆大学)
提出结合大语言模型、频谱和变异技术的Prolog自动调试系统ProDebug,用于识别学生作业中的错误并生成修复方案。
2026-05-26 cs.PL cs.SE
Description and Optimization of Abstract Machines in a Dialect of Prolog
为了实现有竞争力的性能,Prolog和相关语言的抽象机器最终变得庞大而复杂,并在设计和实现级别都包含复杂的优化。同时,效率方面的考虑使得有必要在其实现中使用低级语言。这使得它们很难编码、优化,尤其是维护和扩展。用高级语言编写抽象机器(和辅助代码)可以帮助驯服这种固有的复杂性。我们展示了如何使用Prolog的一个有效的虚拟机的最基本的组件的语义可以描述(的变体)Prolog。然后将这些描述编译成C语言,并组装成一个完整的字节码仿真器。由于所使用的语言的高级别及其与Prolog的接近性,抽象机器描述可以使用标准Prolog编译和优化技术相对容易地进行操作。我们还展示了如何通过有选择地应用程序转换,我们获得抽象的机器实现,其性能可以匹配,甚至超过最先进的,高度调整的,手工制作的仿真器。
2014-11-20 cs.PL
Java Prolog Interface
目前有许多关于Java和Prolog程序设计语言之间交互的倡议。这些举措允许结合两种编程范式,面向对象编程和逻辑编程。每个建议的接口都有特定的功能,这取决于最终的用途。本文介绍了一种新的JavaProlog接口,用于实现Java端的Prolog持久化交互和Prolog端的函数式编程。为了支持这种交互,最高级的解决方案实现了Java对象和Prolog术语之间的语言间数据类型映射。Java Prolog Interface是一个现代化的解决方案,它从现有的解决方案中获得了最好的功能,并将所有功能结合在一起。它更灵活,适应性更强,并且有一个易于使用的应用程序提供者接口(API)。JPI实现了javax.script接口,包括Java 1.6版。该项目像现有的解决方案一样,为最流行的开源Prolog引擎提供了一个实现。托管在Prolobjectlink存储库的GitHub源代码管理上,并将生成的工件部署在Maven Central存储库上。该项目也有一个网页托管在GitHub上。
2022-03-31 cs.PL
XSB: Extending Prolog with Tabled Logic Programming
表逻辑编程(TLP)的范例现在由许多Prolog系统支持,包括XSB,YAP Prolog,B-Prolog,Mercury,ALS和Ciao。这样做的原因部分是理论上的:制表确保终止和最佳已知的复杂性查询的一大类程序。然而,压倒一切的原因是实际的。TLP允许简洁高效地编写复杂的程序,特别是当支持表否定和调用和应答包含等机制时。因此,TLP现在已经被用于从程序分析到语义Web查询的各种应用中。本文提供了一个调查的TLP及其应用程序实现XSB Prolog,以及讨论如何XSB支持制表与动态变化的代码,并在多线程环境。
2010-12-23 cs.PL
Drawing Prolog Search Trees: A Manual for Teachers and Students of Logic Programming
对于习惯于过程式编码的程序员来说,用Prolog编程很难。在本手册中,介绍了绘制搜索树的方法,目的是更好地理解Prolog的工作原理。在给出Prolog数据库、查询和搜索树的第一个例子之后,系统地介绍了绘制搜索树的艺术,给出了用变量、合取、析取和否定进行查询的准则。进一步的例子提供了完整的搜索树,显示在学习Prolog现在!
2020-01-22 cs.LO cs.PL
Multidimensional Predicates for Prolog
2014年,Ungar等人提出了Korz,一种用于构建自适应(面向对象)系统的新计算模型。Korz结合了隐式参数和多重分派来构造多维空间中对象的行为。Korz是一个简单而富有表现力的模型,它不需要特殊的编程技术,如访问者或策略模式,以适应新出现的上下文需求的系统。我们展示了如何Korz的想法可以集成在一个Prolog系统,通过扩展其语法和语义与简单的元编程技术。我们开发了一个库,称为mdp(多维谓词),可用于实验多维Prolog系统。我们强调它的好处与众多的场景,如打印调试信息,备忘录,面向对象的编程和自适应GUI。特别是,我们指出,我们可以结构和扩展Prolog程序与其他关注在一个清晰和简洁的方式。我们还演示了如何Prolog的独特的元编程功能,允许快速实验的语法和语义增强的新的,多维的模型。虽然有许多开放的关注,如效率和可理解性的情况下,更大的系统,我们将看到,我们可以使用的杠杆mdp和Prolog探索新的视野,在自适应系统的设计。
2016-03-20 cs.LO cs.PL cs.SE
Forty hours of declarative programming: Teaching Prolog at the Junior College Utrecht
本文记录了我们的经验,使用声明性语言,让中学生初尝计算机科学。该课程旨在教学生一些关于Prolog编程的知识,但也让他们接触到重要的计算机科学概念,如统一或搜索策略。使用Haskell的Snap框架结合我们自己的NanoProlog库,我们开发了一个Web应用程序来教授这门课程。
2013-01-22 cs.CY cs.PL
Declaratively solving tricky Google Code Jam problems with Prolog-based ECLiPSe CLP system
在本文中,我们展示了几个例子,解决具有挑战性的算法问题,从谷歌代码果酱编程比赛与基于Prolog的ECLiPSe系统使用声明性技术,如约束逻辑编程和线性(整数)编程。这些问题的目的是要解决发明聪明的算法,并有效地实现它们在传统的命令式程序设计语言,但我们目前相对简单的声明式程序ECLiPSe是足够快的比赛规则所规定的时间内找到答案。我们认为ECLiPSe的声明式编程比命令式编程更适合解决Google Code Jam中提供的某些常见编程问题。我们通过比较两种解决方案所需的心理步骤来证明这一点。
2014-12-14 cs.PL
The YAP Prolog System
YAP(Yet Another Prolog)是一个Prolog系统,最初开发于80年代中期,此后一直在不断发展。本文介绍了YAP系统的总体结构和设计,重点介绍了对逻辑编程社区的三个重要贡献。首先,它描述了在YAP中使用的主要技术,以实现一个高效的Prolog引擎。其次,大多数逻辑编程系统有一个相当有限的索引算法。YAP通过提供动态索引机制或即时索引器(JITI)为这一领域做出了贡献。第三,YAP系统的一个重要贡献是在一个逻辑编程系统中集成了或并行和制表。
2011-02-18 cs.PL
Why It's Nice to be Quoted: Quasiquoting for Prolog
Prolog对动态规划、Meta编程和使用上下文无关文法的文本处理的支持使得该语言非常适合于定义领域特定语言(DSL)以及分析、重构或生成其他(编程)语言中的表达式状态。众所周知的DSL是DCG(Definite Clause Grammar)表示法和约束语言,如CHR。这些扩展使用Prolog运算符声明和{...}符号来实现一个好的语法。当外部语言,如HTML、SQL或JavaScript进入画面时,操作符不再满足将这些语言的片段嵌入到Prolog源文件中。此外,Prolog对引用长文本片段的支持很差。Haskell引入了准引号来解决这个问题。在本文中,我们'移植'的Haskell机制,准引用的Prolog。我们表明,这是可以做到干净,准引用可以解决上述问题。
2013-08-19 cs.PL
Pengines: Web Logic Programming Made Easy
当为演绎数据库开发(Web)接口时,客户端所需的功能是通过包装逻辑数据访问谓词的HTTP处理程序提供的。这些处理程序负责在客户端和服务器数据表示之间进行转换,并且通常包括用于对结果进行分页的选项。设计Web可访问的API是困难的,因为很难预测客户端的确切需求。Pengines改变了这一局面。客户端提供一个Prolog程序,通过访问服务器的逻辑API来选择所需的数据。pengine基础设施提供了转换Prolog数据和处理Prolog非确定性的通用机制。Pengines库很小(2000行Prolog,150行JavaScript)。它大大简化了为Prolog程序定义基于AJAX的客户端,并提供Prolog进程之间的非确定性RPC以及与类似于Paul Tarau引擎的Prolog引擎的交互。Pengines作为SWI-Prolog 7的标准包提供。
2014-05-14 cs.PL
Sequence-Based Abstract Interpretation of Prolog
针对现有Prolog抽象解释框架无法覆盖部分控制结构的问题,提出基于替换序列、可处理深度优先搜索与cut操作符的新框架,证明其适配传统抽象域且可涵盖此前的确定性分析工作,实验验证了有效性。
2000-10-19 cs.LO cs.PL
Lazy Stream Programming in Prolog
近年来,流处理已经成为增量处理大量数据的重要方法,在许多程序设计语言中有特殊的支持和库。不幸的是,到目前为止,Prolog中的支持还很缺乏,而且大多数现有的方法都是临时的。为了解决这种情况,我们提出懒惰流生成器作为一个统一的Prolog接口,用于通过I/O和/或算法增量产生的有限和无限数据序列的有状态计算。我们以两种方式向应用程序员公开流生成器:1)通过抽象序列操作API,便于定义自定义生成器,2)作为惯用的惰性列表,与许多现有的列表谓词兼容。我们定义了一个代数的流生成器操作,扩展Prolog通过嵌入式语言解释器,提供了一个紧凑的符号组成的发电机和支持移动之间的两个同构表示。作为一个特殊的例子,我们介绍了答案流生成器,封装协同编程一流的逻辑引擎的工作,并支持前向递归与流和回溯生成的或流之间的互操作。关键词:惰性流生成器,惰性列表,第一类逻辑引擎,流组合器,与流/或流互操作,Prolog扩展
2019-09-19 cs.PL
Coding Guidelines for Prolog
编码标准和良好实践是软件项目的规范方法的基础,无论它们使用什么程序设计语言。Prolog编程可以从这样的方法中受益,也许比其他语言的编程受益更多。尽管如此,到目前为止似乎还没有出现广泛接受的标准和做法。本文件是填补这一空白的第一步:它提供了直接的指导方针,代码布局,命名约定,文档,正确使用Prolog功能,程序开发,调试和测试。每一项准则都有其基本原理,如果存在合理的选择,还说明了每一种选择的相对利弊。编码标准应始终选择在每个项目的基础上,根据主机相关的任何给定的编程项目的问题,因此,本文超越了仅仅提供规范性的指导方针,讨论关键因素和重要的标准,应考虑到在决定一个成熟的编码标准的项目。
2011-05-17 cs.PL
The Janus System: Multi-paradigm Programming in Prolog and Python
本文介绍Janus系统,它紧密集成Prolog和Python于单一进程,实现双向数据转换和每秒数十万次跨语言调用,已用于商业应用,并易于移植到其他Prolog系统。
2023-08-30 cs.LO cs.PL
Using Prolog for Transforming XML Documents
程序设计语言Prolog的支持者都认为Prolog更适合转换XML文档,就像其他成熟的技术和语言一样,比如XML。为了澄清这一立场,这项工作提出了一个tuProlog风格的解释器,用于将XML文档解析为Prolog内部列表,反之亦然,用于将列表序列化为XML文档。基于这个实现,下面比较了prolog和Prolog。首先,研究了标准,如考虑的语言特征的可重用性和可表达性。这些标准已得到验证。其次,它是评估时,Prolog区分输入和输出参数的可逆转换。
2021-04-23 cs.IR cs.PL cs.SE
Extending Prolog for Quantified Boolean Horn Formulas
Prolog是一种基于命题Horn公式的众所周知的声明性程序设计语言。Prolog语言在很多领域都很有用,包括人工智能、自动定理证明、数理逻辑等等,多年来的一个活跃的研究领域是将Prolog语言扩展到更大的逻辑类。它的一些重要扩展包括约束逻辑程序设计和面向对象逻辑程序设计。然而,它不能解决具有任意量化的Horn公式的问题。准确地说,Prolog中的事实、规则和查询不允许有任意量化的变量。本文克服了Prolog的这一主要局限性,通过扩展它的量化布尔霍恩公式。我们通过扩展量化布尔霍恩公式的SLD分辨率证明系统来实现这一点,然后提出了一个有效的实现模型。本文表明,所提出的实现也支持一阶谓词霍恩逻辑与任意量化的变量。本文还首次提出了一种量化布尔Horn公式的声明式编程方法。
2021-03-01 cs.DS cs.LO cs.PL
Applying Prolog to Develop Distributed Systems
分布式系统的开发是一项艰巨的任务。声明式编程技术在有效支持程序员应对这一挑战方面具有很大的潜力。虽然基于数据的语言已经被积极地探索用于编程分布式系统,但Prolog在这个应用领域迄今为止受到的关注相对较少。在本文中,我们提出了一个基于Prolog的编程系统,称为DAHL,分布式系统的声明式开发。DAHL用事件驱动的控制机制和内置的网络过程扩展了Prolog。我们的实验评估使用分布式哈希表数据结构,协议实现拜占庭容错,和分布式软件模型检查器-所有DAHL实现-表明该方法的可行性。
2010-07-22 cs.DC cs.PL
Distributed WWW Programming using (Ciao-)Prolog and the PiLLoW library
我们讨论了从实际的角度来看,一些问题涉及到分布式互联网和WWW应用程序使用LP/CLP系统。我们描述PiLLoW,一个公共领域的互联网和WWW编程库LP/CLP系统,我们设计,以简化编写此类应用程序的过程。PiLLoW提供了访问WWW上的文档和代码的工具;解析、操作和生成HTML和XML结构化文档和数据;生成HTML表单;编写表单处理程序和CGI脚本;以及处理HTML/XML模板。PiLLoW的一个重要贡献是将HTML/XML代码(以及WWW页面的内容)建模为术语。PiLLoW库是在Ciao Prolog系统的背景下开发的,但它已经适应了许多流行的LP/CLP系统,支持其大部分功能。我们还描述了使用并发性和客户端-服务器交互的高级模型,Ciao Prolog的活动模块,在WWW编程的背景下。我们提出了一个解决方案,客户端下载和执行的Prolog代码,使用通用浏览器。最后,我们还提供了一个概述的相关工作的主题。
2003-12-16 cs.DC cs.PL
Logic programming beyond Prolog
逻辑程序是一种可执行的规范。例如,合并排序在纯Prolog中是一个逻辑公式,但在长链表上显示出值得信赖的性能。但这种可执行的规范是一种妥协:逻辑被算法考虑扭曲,但只能通过抽象机器间接执行。本文介绍了关系编程,一种通过关注点分离解决逻辑编程困难的方法。它需要三个文本:(1)公理,一个指定问题并且不受算法考虑影响的逻辑公式,(2)定理,一个表达算法思想并遵循公理的逻辑公式,以及(3)代码,将定理转录为过程语言。代码的正确性依赖于定理与公理的逻辑关系,并依赖于定理到过程语言的准确转录。排序是关系编程具有更高抽象度优势的一个例子:要排序的数据可以是C++(我们在示例中使用的过程语言)中满足线性顺序公理的任何数据类型,而纯Prolog版本仅限于链接单元格形式的数据结构。我们展示了关系程序的另一个优点:它们具有模型理论和不动点语义,它们彼此等价,并且类似于纯Prolog程序。
2015-09-26 cs.LO cs.PL
A Semantics-Aware Editing Environment for Prolog in Eclipse
在本文中,我们提出了一个基于BE4的Eclipse的Prolog插件,并提供了许多功能,如语义感知的语法突出显示,大纲视图,错误标记,内容辅助,悬停信息,文档生成,和快速修复。该插件使用Java解析器进行完整的Prolog,并集成了Prolog引擎,并且可以通过进一步的语义分析进行扩展,例如,基于抽象的解释。
2009-03-12 cs.HC cs.PL cs.SE
Disjunctive Delimited Control
定界控制是一种用于程序设计语言扩展的强大机制,它是最近为Prolog提出的(并在SWI-Prolog中实现)。通过从语言内部操纵程序的控制流,它可以实现强大的功能,如制表,而无需修改Prolog引擎的内部。然而,它目前的公式是不够的:它没有捕捉到Prolog的独特的非确定性的性质,允许多种方式来满足一个目标。本文充分拥抱Prolog的非确定性与一个新的接口分离定界控制,这使程序员不仅控制顺序(合取)控制流,但也超过了非确定性控制流。我们提供了一个元解释器,保守地扩展Prolog与分隔控制,并表明它使一系列典型的Prolog功能和扩展,现在在库级别:findall,削减,分支定界优化,概率编程,。. .这篇论文正在考虑发表在《逻辑程序设计理论与实践》(TPLP)上。
2023-03-07 cs.PL
The Witness Properties and the Semantics of the Prolog Cut
在逻辑编程系统的一些理想的属性的上下文中,被称为见证属性的Prolog的“切割”结构的语义进行了探讨。见证属性涉及对查询的响应的操作一致性。本文描述了Prolog的一个推广,它把否定表示为失败和割,并证明它不具有witness性质。然后描述了系统的限制,该限制保留了切割的选择和第一解行为,但允许系统具有见证属性。限制系统中的切割概念比Prolog硬切割更受限制,但保留了硬切割的有用的第一解行为,而不是被其他提议的切割,如"软切割“保留。有人认为,限制系统实现了一个很好的折衷之间的权力和效用的Prolog切和需要内部一致性的逻辑编程系统。受限系统被赋予了一个抽象的语义,它依赖于见证属性;这种语义表明受限系统与逻辑有着更深层次的联系,而不仅仅是允许一些逻辑计算。这篇论文的部分内容以前曾以不同的形式出现在1995年国际逻辑编程研讨会的会议录中。
2002-01-31 cs.PL
Mapping Objects to Persistent Predicates
Prolog逻辑程序设计在许多需要存储知识的系统中被广泛用于提供持久性。用于供应持久性的Prolog编程语言的一些实现具有与其他程序设计语言的双向接口,总体上具有面向对象的编程语言。目前,缺少用于系统开发的工具和框架,这些工具和框架以简单和敏捷的形式使用逻辑谓词持久性。更具体地说,目前需要一个面向对象和逻辑持久性提供程序,允许在主存中操作对象,并且该对象的持久性具有逻辑编程谓词方面。目前的工作介绍了一个面向对象和逻辑持久性提供者的支持对象的序言声明性映射的替代。所提出的替代方案包括逻辑编程谓词与面向对象方法的对应关系,其中对于逻辑编程的每个元素,一个面向对象的元素使其相互作用。逻辑程序设计谓词的面向对象表示提供了对组成知识的元素进行操作的便利。
2017-05-01 cs.LO cs.PL cs.SE
Towards an Efficient Prolog System by Code Introspection
逻辑程序设计理论与实践(Theory and Practice of Logic Programming,TPLP)一些Prolog解释器是基于Warren抽象机(WAM),一个优雅的模型来编译Prolog程序。为了提高性能,提出了优化子句选择、专门化统一、全局分析、本地代码生成和制表等策略。本文提出了一种不同的策略来实现一个高效的Prolog系统,在飞行中创建专门的仿真器。该策略在YAP Prolog系统上进行了实现和评估,实验评估显示了有趣的结果。
2014-05-11 cs.PL
TWAM: A Certifying Abstract Machine for Logic Programs
类型保持(或类型化)编译使用类型化派生来证明编译的正确性。我们为Prolog的简单类型方言设计并实现了一个类型保留编译器,我们称之为T-Prolog。我们的方法的关键是一个新的认证抽象机,我们称之为类型沃伦抽象机(TWAM)。TWAM有一个足够强的依赖类型系统来指定逻辑框架LF中的逻辑程序的语义。我们提出了一个合理性元定理,它构成了部分正确性保证:良好类型的程序实现的逻辑程序指定的类型。这个元定理证明了我们的设计和实现的证明编译器从T-Prolog到TWAM。
2018-01-01 cs.LO cs.PL
Automatic Differentiation in Prolog
本文用Prolog从符号导数求值规范系统推导前向与反向模式自动微分算法,并应用于概率编程中的参数学习与变分推断。
2023-05-13 cs.PL
A Lambda Prolog Based Animation of Twelf Specifications
在ABCIF系统中的规范是基于爱丁堡逻辑框架或LF的逻辑编程解释。我们认为这样的规范使用Lambda Prolog实现动画的方法。该方法基于将依赖类型的LF表达式有损转换为Lambda Prolog的简单类型λ演算(STLC)项,以及随后在由适当子句定义的谓词中对丢失的依赖性信息进行编码。为了在逻辑编程的实现中使用这个想法,还需要将Lambda Prolog查询的结果转换回LF表达式。我们描述了这样一个逆翻译,并表明它具有必要的属性,以方便仿真的Lambda Prolog程序通过我们的翻译LF规范的行为。BASINF的一个特点是它允许查询由具有由元变量表示的未指定部分的类型组成,元变量的值通过计算找到。我们表明,这种能力可以支持我们的翻译为基础的方法来动画的BMPF规格。
2014-07-06 cs.PL
Fifty Years of Prolog and Beyond
一般来说,逻辑编程,特别是Prolog,都有着悠久而迷人的历史,与它们继承或催化的许多学科交织在一起。在过去的50年里,已经收集了大量的研究,并得到了许多Prolog实现的支持。许多实现仍在积极开发中,而新的实现不断出现。通常,不同系统添加的功能是由程序员和实现者的跨学科需求所驱动的,产生的系统虽然共享“经典”核心语言,特别是ISO-Prolog标准的主要方面,但在其他方面也彼此不同。这显然对代码的可移植性提出了挑战。这个领域也激发了许多相关但完全不同的语言,这些语言创建了自己的社区。本文旨在整合和应用Prolog演变过程中的主要经验教训。报告分为三个主要部分。首先,我们概述了Prolog系统和社区的发展,大约达到ISO标准,考虑到主要的历史发展和几个Prolog实现背后的动机,以及其他逻辑程序设计语言的影响Prolog。然后,我们将讨论在标准出现后最活跃的Prolog实现:它们的愿景、目标、共性和不兼容性。最后,我们进行了SWOT分析,以更好地确定Prolog的潜力,并提出未来的发展方向,Prolog可能会继续添加有用的功能,接口,库和工具,同时提高实现之间的兼容性。
2022-03-14 cs.PL
An Implementation of the Language Lambda Prolog Organized around Higher-Order Pattern Unification
本论文关注Lambda Prolog的实现,Lambda Prolog是一种高阶逻辑程序设计语言,它支持用二叉树语法方法来表示和操作形式语法对象。Lambda Prolog通过使用类型化的lambda术语作为数据结构来扩展类似Prolog的语言来实现其功能,然后通过高阶统一和一些新的程序级抽象机制来操纵这些数据结构。这些额外的功能提出了新的实现问题,必须充分解决Lambda Prolog作为一个有效的编程工具。我们在这里考虑这些问题,最终提供一个虚拟机和基于编译的实现。一个关键的想法是Lambda Prolog的计算模型的方向围绕一个限制版本的高阶统一,具有良好的算法特性,似乎包括最有趣的应用程序。我们的虚拟机嵌入了沃伦抽象机的结构,是在传统的Prolog实现中使用的这种形式的统一的治疗。一路上,我们对待各种辅助问题,如低层次的表示lambda条款,实施减少这些条款和优化处理的类型计算。我们还开发了Lambda Prolog的实际实现,称为Teyjus版本2。该系统的一个特点是用C语言实现了虚拟机的仿真器,用OCaml语言实现了编译器。我们提出了一种治疗的软件问题,从这种混合的语言在一个系统中,我们讨论了相关的问题,我们的虚拟机仿真器的可移植性在任意架构。最后,我们通过使用该系统进行的实验来评估我们的各种设计思想的有效性。
2009-11-27 cs.PL
Representation Sharing for Prolog
表示共享可以通过在重复项之间共享一个表示来减少程序的内存占用。函数式编程系统中最常见的表示共享实现称为散列consing。在Prolog的上下文中,表示共享很少受到关注。一些当前的技术,处理表示共享的审查。新的贡献是:(1)用于{ \em findall/3}的{\em输入共享}的简单实现;(2)在运行时引入表示共享的{ \em sharer}模块的描述。它们的实现在由hProlog实现的WAM的上下文中示出。两者都可以适用于任何WAM类Prolog实现。共享器独立于垃圾收集器工作,但可以使其与垃圾收集器协作。基准测试结果表明,共享器的成本与堆垃圾收集器相当,其有效性高度依赖于应用程序,并且其策略必须根据收集器进行调整。逻辑程序设计理论与实践(Theory and Practice of Logic Programming,TPLP)
2011-06-30 cs.PL
ECLiPSe - from LP to CLP
ECLiPSe是一个基于Prolog的编程系统,旨在开发和部署约束编程应用程序。它也用于教学组合问题解决的大多数方面,例如问题建模,约束规划,数学规划和搜索技术。它使用扩展的Prolog作为其高级建模和控制语言,辅以几个约束求解器库,第三方求解器接口,集成开发环境和嵌入主机环境的接口。本文讨论了语言扩展,实现方面,组件和工具,我们认为相关的方式从逻辑编程约束逻辑编程。
2010-12-20 cs.PL
Logic Programming with Satisfiability
本文提出了一个Prolog接口的MiniSat可满足性求解器。具有可满足性的逻辑程序- ming结合了两种范式的优势:一方面将搜索问题编码为可满足性的逻辑编程,另一方面有效地求解SAT。这两者之间的协同作用暴露了一个编程范式,我们在这里提出的逻辑编程珍珠。为了说明逻辑编程与SAT解决我们给出了一个例子Prolog程序解决部分MAXSAT的实例。
2007-02-13 cs.AI cs.PL
A Constraint-based Mathematical Modeling Library in Prolog with Answer Constraint Semantics
本文提出将Prolog及其约束求解库作为统一的基于关系的建模和编程语言,并实现了一个受MiniZinc启发的Prolog数学建模库,在无明显计算开销的情况下支持数组、量词和迭代器,同时获得答案约束、可编程搜索与求解器以及统一调试环境。
2024-02-27 cs.LO cs.MS cs.PL
Disjunctive Delimited Control
定界控制是一种用于程序设计语言扩展的强大机制,它是最近为Prolog提出的(并在SWI-Prolog中实现)。通过从语言内部操纵程序的控制流,它可以实现强大的功能,如制表,而无需修改Prolog引擎的内部。然而,它目前的公式是不够的:它没有捕捉到Prolog的独特的非确定性的性质,允许多种方式来满足一个目标。本文充分拥抱Prolog的非确定性与一个新的接口分离定界控制,这使程序员不仅控制顺序(合取)控制流,但也超过了非确定性控制流。我们提供了一个元解释器,保守地扩展Prolog与分隔控制,并表明它使一系列典型的Prolog功能和扩展,现在在库级别:findall,削减,分支定界优化,概率编程,…
2021-08-06 cs.LO cs.PL
Making ProB compatible with SWI-Prolog
尽管Prolog程序设计语言的核心自1995年以来已经被ISO标准化,但仍然很难编写可以在多个Prolog实现上不加修改地运行的复杂Prolog程序。实际上,实现有时会偏离ISO标准,标准本身无法涵盖实践中必不可少的许多功能。因此,大多数Prolog应用程序不得不依赖于非标准特性,通常使它们依赖于一个特定的Prolog实现,并且与其他实现不兼容。我们研究这样一个Prolog应用程序:ProB,它已经在SICStus Prolog开发了20多年。本文描述了我们如何设法重构ProB的代码库以支持SWI-Prolog,目的是使用两个独立的工具链来验证ProB的结果。这需要大量的调整,从扩展SWI-Prolog中的SICStus仿真到更好地模块化单片ProB代码库。我们还描述了我们在这个过程中遇到的值得注意的兼容性问题和其他差异,以及我们如何能够通过很少的主要代码更改来处理它们。正在考虑接受TPLP。
2022-05-09 cs.PL
On Feasibility of Declarative Diagnosis
本文探讨Prolog程序调试中声明式诊断方法被忽视的问题,分析其弱点并提出克服方案,论证了声明式诊断在实际编程中的可行性与应用价值。
2023-08-30 cs.LO cs.PL cs.SE
On the Performance of Bytecode Interpreters in Prolog
Prolog语言的语义和递归执行模型使得语言解释器可以很自然地以AST(Abstract StringTree)解释器的形式表示,其中执行遵循程序的树表示。另一种实现技术是字节码解释器。这些解释器在评估之前将程序转换为紧凑和线性的表示,通常被认为更快,更好地利用资源。本文讨论了在Prolog语言中解释器控制流的不同表示方法,并给出了AST和字节码解释器的几种实现。在一个简单的语言设计用于此目的,我们评估是否最好的技术已知的命令式语言是适用于Prolog和如何以及他们的表现。我们的最终目标是评估Prolog中的解释器设计是最有效的,因为我们打算将这些结果应用到更复杂的语言中。然而,我们相信本文中的分析具有更普遍的意义。
2020-08-28 cs.PL
Customisable Handling of Java References in Prolog Programs
用于组合以不同语言范式编写的程序的集成技术有助于以最适合其任务的语言实现专用模块。在Java-Prolog集成的情况下,一个已知的问题是Prolog端对Java对象的引用的正确表示。要解决这一问题,需要从多个方面进行考虑,包括引用表示、表示的不透明性、身份保持、引用寿命和跨语言转换策略的范围。本文提出了一种方法,解决所有这些方面,概括和建立在Prolog中的外国参考文献的现有表示模式,并从其他领域中发现的类似的中间语言表示技术中汲取灵感。我们的方法通过对Prolog引擎与Java的交互做一些假设(例如,嵌入或作为外部进程执行)。我们验证我们的工作扩展JPC,一个开源的集成库,支持我们的方法的功能。我们的JPC库目前通过驱动程序与三种不同的开源Prolog引擎(SWI,YAP和XSB)兼容。出现在逻辑编程理论与实践(TPLP)中。
2014-05-29 cs.PL
Logic Programming with Macro Connectives
像Prolog这样的逻辑编程通常是顺序的,而且速度很慢,因为每个执行步骤只处理一个$micro$连接符。为了解决这个问题,我们建议使用$macro$连接词作为提高可读性和性能的手段。
2018-05-07 cs.PL
A structured alternative to Prolog with simple compositional semantics
Prolog非常有用的表达能力是传统的逻辑编程语义所不能捕捉的,主要是由于cut、goal和子句顺序。已经提出了几种替代语义,暴露了计算状态的操作细节。我们建议,而不是重新设计Prolog结构化的替代方案,以削减和条款,保持表达能力和计算模型,但组成的指称语义更简单的状态,只是变量绑定。这大大简化了程序员和工具(如部分求值器)对程序的推理,并通过谓词定义安全地展开调用。if-then-else across子句取代了cut的大多数用法,但cut的全部功能是通过until结构实现的。析取、合取、until和统一是基本的目标类型,具有组合语义,产生变量绑定解决方案的序列。这通过最小不动点构造的通常技术扩展到程序。一个简单的解释器Prolog的替代语言,直到在Prolog的定义,建立了相同的表达能力的两种语言。许多有用的控制结构都是从原语中派生出来的,语义框架阐明了对替代结构的讨论。形式化依赖于具有变量抽象的术语语言,如λ-演算中。子句是调用参数、延续和局部变量的抽象。它可以是包含性的,也可以是排他性的,表示通过析取或if-then-else绑定到延续的局部情况。子句是开放的定义,由简单的函数应用(β-归约)组成(和封闭)。这为灵活的模块组合机制的简单说明铺平了道路。Cube是一种具有公开原则的具体语言,已经实现。
2011-07-27 cs.PL
On the incorporation of interval-valued fuzzy sets into the Bousi-Prolog system: declarative semantics, implementation and applications
University of the Bío-Bío(比奥比奥大学);University of Dundee(邓迪大学);Universidade de Santiago de Compostela(圣地亚哥德孔波斯特拉大学)
在本文中,我们分析的好处,将区间值模糊集的Bousi-Prolog系统。语法,声明性语义和实现此扩展,并提出和形式化。我们表明,通过使用潜在的应用程序,模糊逻辑编程框架与他们增强,可以正确地与词汇资源和本体一起工作,以提高他们的知识表示和推理的能力。
2017-11-08 cs.AI cs.CL cs.PL
More declarative tabling in Prolog using multi-prompt delimited control
几个Prolog实现包括一个制表设施,一个替代的解决策略,使用memoisation,以避免冗余的重复计算。直到最近,制表还需要底层Prolog引擎中的低级支持,或者广泛的程序transmittance(de Guzman等人,2008年)。另一种方法是增加Prolog与低级别的支持连续捕获控制操作符,特别是定界的延续,这已经在函数编程领域进行了研究,并发现能够支持各种各样的计算效果,否则声明性语言。本技术报告描述了基于Schrijvers等人(2013)最近引入的Prolog分隔控制运算符的SWI Prolog中的制表实现。与之前使用分隔控件的SWI Prolog制表实现(Desouter等人,2015),这种方法基于Johnson(1995)的函数记忆解析器组合子,更接近Prolog的声明性核心,需要更少的代码,并且能够从表格谓词系统中增量地交付解决方案(而不是在将任何解决方案交付给程序的其余部分之前找到所有解决方案)。一组基准测试表明,少量精心针对性的优化产生的性能在Desouter等人的优化版本的约2倍之内。的系统目前包含在SWI Prolog中。
2017-08-24 cs.DS cs.PL
Typing constraint logic programs
本文提出了一个约束逻辑程序的参数多态和子类型的规定类型系统。这种类型的系统的目的是静态地检测编程错误。它为约束逻辑程序和模块引入了一种类型规则,同时保持了在约束域之间执行通常的转换的能力,以及由于子类型的灵活性而类型化元编程谓词的能力。主语归约的性质表达了规定类型系统与规则类型系统的一致性。执行模型:如果一个程序是“良好类型的”,那么所有从“良好类型的”目标开始的派生都是“良好类型的”。该性质是证明w.r.t.约束程序设计的抽象执行模型,它只通过约束的累积来进行,而w.r.t.一个丰富的执行模型与类型约束的替代。我们描述了我们的实现系统的类型检查和类型推断。本文报告了我们在ISO-Prolog、Sicstus Prolog的约束库和其它Prolog程序上进行类型检查的实验结果。
2004-05-27 cs.PL
An Executable Specification of Typing Rules for Extensible Records based on Row Polymorphism
类型推断是一个自然适合逻辑编程(LP)的应用领域。LP系统本身支持统一,统一是典型类型推断算法的基本构建块。特别地,Hindley-Milner类型系统(HM)中的多态类型推断可以在Prolog中简洁地指定和执行。在我们以前的工作中,我们已经证明了HM之外的参数多态性的更高级的功能,如类型构造函数多态性和种类多态性,可以类似地在Prolog中指定。在这里,我们展示了记录,这是在现实世界的程序设计语言中最广泛支持的复合数据结构之一的规范,并讨论了Prolog作为类型系统的规约语言的优点和局限性。记录类型被指定为映射到其相应类型的命名字段的顺序无关集合。此外,使用开放式集合来支持记录类型的行多态性,以使其具有可扩展性。
2017-09-12 cs.PL
A Higher-Order Abstract Syntax Approach to Verified Transformations on Functional Programs
我们描述了一种方法来验证实现的转换功能的程序,利用高阶表示的语法。在这种方法中,使用遗传Harrop公式的逻辑指定变换。一方面,这些规范直接作为实现,是Lambda Prolog语言中的程序。另一方面,它们可以用作Abella系统的输入,该系统允许我们证明关于它们的属性,从而证明关于实现的属性。我们认为,这种方法是特别有效的实现转换,分析绑定结构。我们通过在Lambda Prolog中描述对这种结构敏感的类型化闭包转换和代码提升等转换的简洁编码,并通过展示如何使用Abella证明其正确性来做到这一点。
2016-01-23 cs.LO cs.PL
Using SWISH to realise interactive web based tutorials for logic based languages
编程环境已经从纯粹的基于文本发展到使用图形化用户界面,现在我们看到了向基于Web的界面(如Webyter)的转变。基于Web的界面允许创建由文本和程序组成的交互式文档及其输出。可以使用web技术来呈现输出,例如,文本、表格、图表或图形。这种方法特别适合捕获数据分析工作流和创建交互式教育材料。本文介绍了SWISH,它是Prolog的Web前端,由一个用SWI-Prolog实现的Web服务器和一个用JavaScript编写的客户端Web应用程序组成。SWISH提供了一个Web服务器,多个用户可以在其中操作和运行相同的材料,并且它可以进行调整以支持Prolog扩展。在本文中,我们描述了SWISH的体系结构,并描述了两个案例研究的Prolog扩展,即概率逻辑编程(PLP)和逻辑产生式系统(LPS),使用SWISH提供教程网站。
2020-01-30 cs.PL
An Integrated Development Environment for Declarative Multi-Paradigm Programming
在本文中,我们提出了CIDER(咖喱集成开发环境),一个分析和编程环境的声明性多范式语言咖喱。CIDER是一个图形环境,通过提供程序分析和可视化的集成工具来支持Curry程序的开发。CIDER完全在Curry中实现,使用GUI编程(基于Tcl/Tk)和元编程库。我们的环境的一个重要方面是开发环境对其他声明性源语言(例如,Prolog或Haskell)和扩展性w.r.t.新的分析方法。为了支持后一个特性,底层实现语言Curry的惰性求值策略变得非常有用。
2001-11-19 cs.PL cs.SE
Evaluation of the Implementation of an Abstract Interpretation Algorithm using Tabled CLP
CiaoPP是Ciao Prolog系统中逻辑程序的分析器和优化器。它包括PLAI,一个不动点算法的抽象解释的逻辑程序,我们适应使用表格约束逻辑编程。在这种适应中,制表引擎驱动定点计算,而约束求解器处理不同子句的抽象替换的LUB。这简化了代码并提高了性能,因为终止,依赖关系和一些关键操作(例如,分支切换和恢复)由制表引擎直接处理。确定是否已经达到不动点使用语义等价,这可以决定两个语法不同的抽象替换表示抽象域中的同一元素。因此,与使用语法相等的分析器相比,制表分析器可以在更多情况下重用答案。这有助于实现更好的性能,即使考虑到与这些检查相关的额外成本。我们的实现基于Ciao Prolog中的TCLP框架,并且是CiaoPP中初始定点实现的三分之一大小。它的性能进行了评估,通过分析几个程序使用不同的抽象域。这篇论文正在考虑发表在《逻辑程序设计理论与实践》(TPLP)上。
2019-07-31 cs.PL
Logic programming in the context of multiparadigm programming: the Oz experience
Oz是一种多范式语言,支持逻辑编程作为其主要范式之一。多范式语言被设计为支持不同的编程范式(逻辑、函数、约束、面向对象、顺序、并发等)。同样轻松。本文有两个目标:在Oz中给出逻辑编程的教程,并展示逻辑编程如何自然地融入多范式编程的更广泛背景。我们的经验表明,有两类问题,我们称之为算法和搜索问题,逻辑编程可以帮助制定实际的解决方案。数学问题有已知的有效算法。搜索问题没有已知的有效算法,但可以用搜索来解决。Oz对逻辑编程的支持专门针对这两个问题类,使用每个问题类所需的概念。这与Prolog方法相反,Prolog方法用一组概念来针对两个类,这导致对每个类的支持不是最佳的。为了解释算法程序和搜索程序之间的本质区别,我们定义了Oz执行模型。这个模型包含了并发逻辑编程(committed-choice-style)和基于搜索的逻辑编程(Prolog-style)。与Horn子句语法不同,Oz有一个简单的、完全组合的、高阶的语法,它适应了语言的能力。最后,我们总结了从这项工作中吸取的教训,奥兹国的简史,以及奥兹国文学的许多切入点。
2002-08-20 cs.PL
An overview of Ciao and its design philosophy
我们提供了一个全面的描述Ciao多范式编程系统,强调其设计和实现背后的一些新的方面和动机。Ciao的一个重要方面是,除了支持逻辑编程(特别是Prolog)之外,它还为程序员提供了大量来自不同编程范式和风格的有用功能,并且每个程序模块都可以随意打开和关闭这些功能(包括Prolog的功能)。因此,给定模块可以使用例如,高阶函数和约束,而另一个模块可能使用赋值、谓词、Prolog元编程和并发。此外,该语言被设计为以简单和模块化的方式进行扩展。Ciao的另一个重要方面是它的编程环境,它提供了一个强大的预处理器(带有相关的断言语言),能够静态地发现非平凡的bug,验证程序是否符合规范,并执行许多类型的优化(包括自动并行化)。此类优化产生的代码与其他动态语言或(实验性)优化编译器甚至静态语言具有高度竞争力,同时保留动态语言的灵活性和交互式开发。这种编译体系结构支持模块化和独立编译。该环境还包括一个功能强大的自动文档管理器和一个单元测试框架,两者都与断言系统紧密集成。本文提供了语言和程序开发环境的非正式概述。它旨在说明设计哲学,而不是详尽无遗,这在一篇期刊论文中是不可能的,而是指向以前的Ciao文献。
2011-02-27 cs.PL
A scheme for dynamically integrating C library functions into a $λ$Prolog implementation
Teyjus系统通过将程序编译成用于抽象机器的字节码并使用用于机器的模拟器执行该翻译形式来实现高阶逻辑程序设计语言$λ$ Prolog。Teyjus支持许多通过C代码实现的内置关系。在目前的计划中,这些关系是通过包括C程序,实现它们的模拟器和定制的编译器产生的指令调用这样的代码。这种方法有两个缺点。首先,整个库函数集合必须包含在系统中,从而导致比必要的内存占用更大。其次,增强内置谓词的集合需要改变模拟器和编译器的部分,完成这项任务需要这两个子系统的特定知识。该项目分三步解决这些问题。首先,内置函数的代码从模拟器移动到库中,在加载时,由字节码文件中的信息确定的相关部分从库链接到运行时系统。第二,将每个库函数的信息与如何从$λ$ Prolog程序中调用它以及在哪里可以找到它的C代码相关联。最后,修改编译器以使用前面的信息在字节码文件中包含相关的链接指令,并将对内建关系的调用转换为调用动态链接代码的特殊指令。更一般地说,这些想法是能够支持接口在$λ$ Prolog中的“外来功能”在C中实现,也讨论了可能性。
2019-06-03 cs.PL
On the Implementation of the Probabilistic Logic Programming Language ProbLog
K.U. Leuven(鲁汶大学)
在过去的几年里,人们对概率逻辑学习和统计关系学习领域的兴趣激增。在这一努力中,许多概率逻辑被开发出来。ProbLog是Prolog最近的一个概率扩展,其动机是挖掘大型生物网络。在ProbLog中,事实可以用概率来标记。这些事实被视为相互独立的随机变量,表明这些事实是否属于随机抽样程序。可以向ProbLog程序提出不同类型的查询。我们介绍的算法,使这些查询的有效执行,讨论他们的实施上的YAP-Prolog系统,并评估其性能的背景下,大型网络的生物实体。
2010-06-23 cs.LG cs.LO cs.PL
Description, Implementation, and Evaluation of a Generic Design for Tabled CLP
具有制表和约束的逻辑编程(TCLP,表格约束逻辑编程)已被证明比LP,CLP或LP +制表更具表达力,在某些情况下更有效。以前的设计TCLP系统没有充分利用蕴涵,以确定呼叫/应答包容,并没有提供一个简单的和良好的记录接口,以促进现有的制表系统中的约束求解器的集成。我们研究的作用,投影和蕴涵在终止,健全和完整的TCLP系统,并提出了设计和实验评估的Mod TCLP,一个框架,简化了额外的约束求解器的集成。Mod TCLP将约束求解器视为制表系统的客户端,这是通用的w.r.t.解决方案,只需要一个明确的接口,从后者。我们通过整合四个约束求解器来验证我们的设计:以前存在的用于差分约束的约束求解器,用C编写; Holzbaur的CLP(Q)和CLP(R)的标准版本,用Prolog编写;以及有限格上的方程的新约束求解器。我们使用上述约束求解器在几个基准测试中评估我们的框架的性能。Mod TCLP是在Ciao Prolog中开发的,Ciao Prolog是一个健壮、成熟的下一代Prolog系统。逻辑程序设计理论与实践(TPLP)
2018-09-15 cs.LO cs.PL