问题标签 [prolog]
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.
prolog - 在 Prolog 中获取谓词的所有解决方案
我正在用 Prolog 编写一个文字冒险游戏,并且正在打印房间出口。我有代码:
其中 connected/2 是:
路径是:
等等。
但是,当我打印房间的出口时,它得到第一个,然后想要一个';' 说我想要另一个解决方案。无论如何,是否有强制谓词完全计算结果,这样玩家就不必继续要求更多的退出?
algorithm - 什么是最佳的“最通用的统一器”算法?
问题
什么是最有效的 MGU 算法?它的时间复杂度是多少?在堆栈溢出答案中描述是否足够简单?
我一直试图在 Google 上找到答案,但一直在寻找我只能通过 ACM 订阅访问的私人 PDF。
我在 SICP 中找到了一个讨论:这里
解释什么是“最通用的统一算法”:采用两个包含“自由变量”和“常量”的表达式树......例如
然后最通用统一器算法返回使两个表达式等效的最通用绑定集。例如:
“最一般”的意思是您可以改为绑定{x ↦ 1}
and{z ↦ 1}
并且这也可以使e1
和e2
等效,但它会更具体。
SICP 文章似乎暗示它相当昂贵。
对于信息,我问的原因是因为我知道类型推断也涉及这种“统一”算法,我想了解它。
prolog - 有向图的叶节点 - Prolog
有谁知道,如何在 Prolog 中获取叶节点列表?
假设,我有一个由这些有向边描述的简单有向图:
现在,如何递归地浏览图并编写这 2 个叶节点(节点 1 和 5)的列表?
感谢您的任何回答!
编辑:
好吧,我有第一个谓词编写和工作:
但是现在,我不知道如何遍历图形并编写叶节点的输出列表。我知道,这很容易,但我没有这种思维和编程方式的经验:(
.net - .NET 的最佳 AI 语言/框架是什么?
我正在构建一个包含回合制策略游戏的学术作品。我将 XNA 3 用于图形,但没有决定将什么用于 AI。
我正在考虑使用 P#,一个用于 .NET 的 Prolog 解释器,但我发现它有点差。对于游戏 AI,你有什么比 Prolog(也许是 Haskell?)或比 P# 更好的解释器更好的东西吗?
prolog - Prolog谓词问题
我只是从 Prolog 开始,我无法弄清楚为什么以下内容不能按我的预期工作。如果列表 L2 包含在 L1 中,我正在尝试创建一个返回 true 的谓词。这是我写的:
我认为这将等同于“如果'L3 = X | L2'的X在L1中,并且L2也在L1中则为真”,包含(L1,L2)被递归翻译,直到所有成员都被遍历我们只剩下最后一个选项,或者我们找到一个不在 L1 中的成员,它将使谓词失败。
不幸的是,它似乎不是那样工作的。好像只返回 member(X, L1) 的值,所以 contains([1,2,3],[1,4,5]) 就通过了,但是 contains([1,2,3],[4, 1,5])没有。
我究竟做错了什么?
.net - .Net 的 Prolog 编译器
任何人都可以为.Net推荐一个Prolog编译器。
网上搜到的,好像好几年没更新了。
谢谢
设拉子
prolog - 为什么这个 Prolog 谓词有效?
我有以下代码: 请记住,虽然此代码适用于列表,但这些列表表示集合,因此 [1,1,2,2,3,3] 和 [1,2,3] 应该是等效的。
这个想法是 equals([1,2,3],[1,2,1,3]) 应该返回 true。但是,根据上述定义,我期望发生的情况如下:
- equals([1,2,3],[1,2,1,3]) 匹配第一条规则,并调用 equals([2,3],[2,1,3]])。
- equals([2,3],[2,1,3]]) 匹配第二条规则并调用 contains([2,3], [2,1,3]), contains([2,1,3], [2,3])。
- contains([2,3], [2,1,3]) 失败,equals 返回 No。
然而它仍然有效。其他试图混淆它的尝试也是如此。有人可以向我解释一下吗?
(Prolog 实现:SWI-Prolog 版本 2.7.12)
prolog - PROLOG 规则仅返回第一个匹配项
我正在尝试在 Prolog 中实现 findall 谓词(是的,我知道它是内置的,这是用于分配的)。
它是这样写的:
出于某种原因,它只给了我第一个解决方案并停在那里,好像第二次调用 my_findall 失败了。据我了解,回溯机制应该遍历所有可能的选项,其中应该包括调用 Pred(N,P) 的所有选项,所以即使第二次调用在第一次尝试时应该失败(为 Pred 尝试的第一个选项已经被断言),它应该在放弃并转到 my_findall(( , ),_, []) 之前先尝试所有其他选项。
如果这不是它的工作原理,有没有办法在不完全重写解决方案的情况下强制这种行为?
c# - C#程序员需要学习Prolog、Haskell
我是一名 C# 程序员,在经历了一些关于函数式编程和声明式编程的精彩讨论之后。我觉得我两者都不擅长:P,所以,我正在考虑开始学习 prolog 和 haskell。请建议这样做的可行性。如果我学习 F#,那么学习 Haskell 是否有意义?这些语言将为我提供哪些可以帮助我编写更好的 c# 程序的品质?