问题标签 [logic-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
logic-programming - pyDatalog 可以用来检查是否满足所有数据依赖关系吗?
我正在尝试使用pyDatalog来确定是否满足各种功能的依赖关系。某些库 (lA,lB,...) 提供功能 (fX,fY,...) 所需的输出 (1,2,...)。
例如:
使用 pyDatalog 图形教程,我可以找到至少提供功能所需输出之一的库:
这将返回: [('lA',), ('lB',)] 因为它只是查找具有至少一个特征路径的任何库。
有没有一种好方法可以使用 pyDatalog 仅返回满足该功能所有需求的库?
prolog - Prolog:如何实现三个中两个最大数的平方和?
《计算机程序的结构和解释》一书的练习 1.3提出以下问题:
定义一个将三个数字作为参数并返回两个较大数字的平方和的过程。
我正在学习 Prolog。这是我尝试实现的功能:
但是,当我运行它时,它会给出以下错误:ERROR: is/2: Arguments are not sufficiently instantiated
. 我想我不仅没有得到 Prolog 的语法,而且还没有得到逻辑编程范式。那么,我怎样才能以良好的逻辑编程风格实现这个功能呢?
logic - 不动点和证明理论
对于任何给定的逻辑程序,它的证明理论使用 SLD(选择性线性定)分辨率来找到查询的可满足性。对于相同的逻辑程序,我们可以应用不动点定理来找到模型。
我的问题是,
我们应该考虑将逻辑程序的不动点作为证明理论或模型理论,还是两者都不是?
parsing - 在 Prolog 中使用差异列表的这种上下文无关语法如何运作?
我正在阅读有关 Prolog 中上下文无关语法的教程,他们在页面底部提到使用差异列表在 Prolog 中实现上下文无关语法,其中包括以下代码块:
它提到:
仔细考虑这些规则。例如,s 规则说:我知道列表 X 和 Z 表示一个句子,如果 (1) 我可以消费 X 并留下一个 Y,并且 X 和 Y 对表示一个名词短语,并且 (2)然后我可以继续消费 Y 留下 Z,YZ 对代表一个动词短语。np 规则和第二个 vp 规则的工作方式类似。
和
将第一个列表视为需要使用的内容(或者如果您愿意:输入列表),将第二个列表视为我们应该留下的内容(或:输出列表)。从这个(相当程序)的角度来看,差异列表
代表一个女人射杀一个男人的句子,因为它说:如果我把左边的符号都吃光了,把右边的符号都留下了,那么我就有了我感兴趣的句子。也就是我们感兴趣的句子是这两个列表内容的区别。
这就是我们需要知道的关于重写我们的识别器的差异列表的全部内容。如果我们简单地记住消费某物并留下某物的想法,我们将获得以下识别器:
作为解释,但这并没有做任何事情来向我澄清这段代码。我知道它比 using 更有效append/3
,但至于消耗事物并将其他事物抛在后面的概念,它似乎比以前的append/3
实现更令人困惑,我就是无法理解它。此外,当我将该代码复制并粘贴到Prolog 可视化器中以尝试理解它时,可视化器说有错误。任何人都可以对此有所了解吗?
prolog - Dijkstra 路径(不仅是距离)
我有计算 Dijkstra 路径最小距离的代码。你能帮我编辑我的代码,以便不仅打印最小距离,还打印完整路径吗?
谢谢!
编辑:我已经编辑了我的代码,因为我忘记添加邻域和边缘谓词。
prolog - Prolog 组合学
有没有办法产生所有的可能性,比如 9 个字母分成 3 个团队,像这样:
- 第一队:2个字母
- 第二组:3个字母
- 第三组:4个字母
- ?
例子:
下一代应该是下一个组合,直到没有更多的组合。
clojure - 使用 clojure 的 core.logic / minikanren 查找相似的集合
这是我关于 Stack Overflow 的第一个问题。
我是逻辑编程的新手,正在尝试评估它是否可以用来解决我正在处理的一些匹配问题。
问题:
假设我们有一个看起来像这样的集合 A。
然后我们还有一些看起来像这样的其他集合。
我要解决的问题是,
“找到与我们所知的其他集合相比,与集合 A 共享最多成员的集合。”
这种情况下的答案应该是集合 D,因为它与集合 A 共享三个成员。与仅与 A 共享两个和一个成员的其他集合相比。
问题一:
逻辑编程能解决这类问题吗?
问题2:
如果可以,您将如何在例如 Clojure 的 core.logic 中做到这一点?
bash - SWI Prolog 通过命令行参数传递一个非零参数的目标
SWI Prolog 允许在具有非零参数的顶级之前执行目标,如下所示
但是,当按如下方式指定具有非零元数的谓词时
它给出了一个错误
应该怎么做才能在顶层之前传递一个非零元数谓词作为目标?
prolog - Prolog XOR 对列表元素
我是 Prolog 的新手,我想对长度为 n 的给定列表的元素应用 XOR 操作。如果列表在第一个 n-1 元素中包含一些错误元素或最后一个元素为 True,则谓词应返回 True。
到目前为止,我已经编写了以下代码,但它不能正常工作,例如查询 ?- function([true,false,false]) 谓词应该返回 True 但它返回 false。
如果您能帮助我,我将不胜感激。谢谢!
prolog - 如何实现完全声明性的 Horn 逻辑?
我想形式化一些知识并在可能被称为完全声明性的Horn 逻辑(或完全声明性的 Prolog)中执行查询。谁能提供一些有关如何实施它的指导方针?我简要回顾了上面链接中的详细描述:
形式语言是 Prolog 的(核心)语言:“程序”是 Prolog 中的一组规则和事实(包括函数和变量,基本上只包含用户定义的谓词)。
然而,与 Prolog 相比,我正在寻找一种相对于逻辑程序的标准声明语义而言是健全和完整的实现——最小的 Herbrand 模型(即,归纳定义的一组基本术语)。在逻辑编程的理论工作中,这通常是研究的对象,众所周知,可以(在“递归可枚举”意义上)获得对查询的健全和完整的答案,例如,使用 SLD 解析受以下条件:
- 匹配规则的公平搜索(例如,Prolog 的深度优先搜索不公平);
- 与“发生检查”的统一(检查变量没有出现在与之统一的术语中)。
我正在寻找一种基于现有功能的简洁实现,而不是发明轮子。我看到的两个更有希望的方向是将其实现为 Prolog 的元解释器,或者作为某些定理证明器的一部分。任何具有这些领域实践知识的人都可以就如何实施它提供一些指导吗?能否在miniKanren中轻松实现?
我的意图是以完全声明的方式形式化一些知识。这种形式化的关键特征是它精确地对应于(单调)归纳的数学概念,因此可以很容易地用归纳论证来推理知识及其属性。