问题标签 [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.
functional-programming - 逻辑编程的最佳用途是什么?
我所说的逻辑编程是指声明性编程语言的一个子范式。不要将此问题与“您可以使用 if-then-else 解决什么问题?”混淆。
像 Prolog 这样的语言非常吸引人,值得为了学习而学习,但我不得不想知道什么样的现实世界问题最好用这种语言来表达和解决。有更好的语言吗?逻辑编程是否存在于更流行的编程语言中?答案的愤世嫉俗的版本是Python Paradox的变体吗?
programming-languages - 为什么逻辑编程没有流行起来?
随着时间的推移,函数式编程似乎对其他编程语言的影响越来越大。我们在我的 AI 课程中开始使用 Prolog,似乎有一些东西可以让非 AI 领域的编程变得更容易。我的问题是:为什么逻辑编程没有以同样的方式流行起来?
在本主题中,似乎达成了普遍共识,即逻辑编程是有用的,但必须证明这一点。它没有被视为有用的原因吗?
更新:也许我应该更清楚一点。我并不是真的在问 Prolog。我明白为什么在大多数实际应用程序中选择 Prolog 不是一个好主意。
举一个我正在谈论的更多示例,请考虑 Python 中的列表推导/映射/过滤器。这些显然受到函数式语言的影响。为什么像 Python 这样的语言还没有像函数式语言那样从逻辑编程语言中吸取这些东西?
prolog - Prolog 中的广度优先
在 Prolog 中使用广度优先而不是默认的深度优先搜索方案的一般想法是什么?
不取无限分支?
在 Prolog 中有没有使用广度优先的一般方法?我一直在谷歌搜索,我没有找到太多对新手有用的信息。
prolog - Prolog 方言 Prova 的文档
我想从 SWI-Prolog 切换到Prova——但这似乎比预期的要难:
谓词 likesucc()
不可用并且操作 likeVar1+Var2>Var3
不起作用(显然它必须Var3<Var1+Var2
是有效的)。
是否有描述 Prolog 方言之间差异的文档?
java - Java的嵌入式Prolog解释器/编译器
我正在开发一个 Java 应用程序,它需要做一些复杂的逻辑规则推导作为其功能的一部分。我想用 Prolog 或其他一些逻辑/约束编程语言而不是 Java 来编写我的逻辑推导,因为我相信生成的代码会更简单且更易于维护。
我在 Prolog 上搜索了嵌入式 Java 实现,并找到了它们的数量,每个都只有很少的文档。我的(适度的)选择标准是:
- 应该可以嵌入到 Java 中(例如可以与我的 java 包捆绑在一起,而不需要在外部程序上进行任何本机安装)
- 从 Java 中使用的简单接口(用于启动扣除、检查结果和添加规则)
- 至少提供一些关于如何使用它的示例
- 不一定必须是 Prolog,但具有上述标准的其他逻辑/约束编程语言也可以满足我的需求。
我有哪些选择,它们的优点和缺点是什么?
python - Python中的关系/逻辑编程?
我是一名长期的 python 开发人员,最近被介绍给 Prolog。我喜欢为某些类型的任务使用关系规则的概念,并想将其添加到我的曲目中。
有没有好的 Python 逻辑编程库?我在谷歌上做了一些搜索,但只找到了以下内容:
jtauber 关于relational_python 的博客系列
很想与其他一些人进行比较...谢谢!
-aj
multithreading - 多线程……函数式语言?(序言)
当我的朋友在学校开始学习 Prolog 时,我取笑他学习了一种无用的语言。然而,他向我展示了一些我什至不知道可能的东西;我想知道这种技术是从哪里来的。
技术是这样的:
在这段代码中,isAMember(X, List)
是一个函数,如果X
是 in则返回 true List
。然而,到目前为止X
还没有被定义为一个变量——所以程序将产生一堆新线程,每个可能的值都为X
真isAMember(X, List)
,然后从那里继续。
这使我们能够以我能想象到的最简单、最优雅的方式创建多线程算法。
所以我的问题是: 这是 Prolog 特有的,还是所有逻辑和/或功能语言的特性? 另外,我在哪里可以学习更多像这样令人惊叹的多线程技术——这肯定是编程的未来。
.net - .NET 的逻辑变量支持
我正在寻找一个允许我在 F# 中使用逻辑变量的库/程序集。我想避免在实现所需的联合查找数据结构、统一代码等方面重新发明轮子。
我找到了 Prolog.NET,但手册有点稀疏。我不想要一个成熟的 Prolog 实现,而只是它对逻辑变量的处理和手册在这方面有点缺乏。
这是我希望能够做到的:
- 声明新的逻辑变量
- 绑定一个 log.var。到一个术语(最好图书馆允许完整的 Herbrand 术语)
- 均衡 log.vars。(即统一)
- log.vars 的元处理。(它是地面吗?其他 log.vars。它被均衡了吗?...)
- 最终,该库甚至支持匹配,即单向统一。
有谁知道做这一切的任何图书馆,或者至少可以用作起点的图书馆?
data-structures - 我应该如何在 Maude 中实施指向分析?
我将实现一个指向分析算法。我想主要基于Whaley 和 Lam 的算法来实现这个分析。Whaley 和 Lam 使用基于BDD的Datalog实现来表示和计算点到分析关系。
下面列出了在典型的指向分析中使用的一些关系。请注意,如果、和都为真,则D(w, z) :− A(w, x),B(x, y), C(y, z)
表示为真。BDD 是用来表示这些关系的数据结构。D(w, z)
A(w, x)
B(x, y)
C(y, z)
关系
规则
我需要了解Maude是否是实施点对点分析的良好环境。我注意到 Maude 使用了一个名为BuDDy的 BDD 库。但是,看起来Maude 将 BDD 用于不同的目的,即统一。所以,我想我也许可以使用 Maude 而不是 Datalog 引擎来计算我的点到分析的关系。我假设莫德同时传播独立信息。这种并发性可能会使我的指向分析比顺序处理规则更快。但是,我不知道代表我在莫德的关系的最佳方式。是我自己在 Maude 中实现 BDD,还是 Maude 基于 BDD 的内部统一也有同样的效果?
scala - 你可以在 Scala 中进行逻辑编程吗?
我在某处读到,Scala 中的匹配/大小写功能所支持的模式匹配实际上是从 Prolog 等逻辑语言中借来的。
你能用 Scala 优雅地解决像 Connected Graph 问题这样的问题吗?例如https://web.archive.org/web/20100214144956/https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html