问题标签 [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.

0 投票
1 回答
3910 浏览

prolog - 在 gprolog 中声明谓词动态

我在 Prolog 中有这段代码:

但我仍然收到此错误:

当我执行 goto(foo) 时。

我已经阅读了动态文档,但我不知道如何使用它,至少在 gprolog 中是这样。我错过了什么吗?

0 投票
1 回答
6926 浏览

prolog - 在 Prolog 中获取谓词的所有解决方案

我正在用 Prolog 编写一个文字冒险游戏,并且正在打印房间出口。我有代码:

其中 connected/2 是:

路径是:

等等。

但是,当我打印房间的出口时,它得到第一个,然后想要一个';' 说我想要另一个解决方案。无论如何,是否有强制谓词完全计算结果,这样玩家就不必继续要求更多的退出?

0 投票
2 回答
4154 浏览

algorithm - 什么是最佳的“最通用的统一器”算法?

问题

什么是最有效的 MGU 算法?它的时间复杂度是多少?在堆栈溢出答案中描述是否足够简单?

我一直试图在 Google 上找到答案,但一直在寻找我只能通过 ACM 订阅访问的私人 PDF。

我在 SICP 中找到了一个讨论:这里

解释什么是“最通用的统一算法”:采用两个包含“自由变量”和“常量”的表达式树......例如

然后最通用统一器算法返回使两个表达式等效的最通用绑定集。例如:

“最一般”的意思是您可以改为绑定{x ↦ 1}and{z ↦ 1}并且这也可以使e1e2等效,但它会更具体。

SICP 文章似乎暗示它相当昂贵。

对于信息,我问的原因是因为我知道类型推断也涉及这种“统一”算法,我想了解它。

0 投票
2 回答
1865 浏览

prolog - 有向图的叶节点 - Prolog

有谁知道,如何在 Prolog 中获取叶节点列表?

假设,我有一个由这些有向边描述的简单有向图:

现在,如何递归地浏览图并编写这 2 个叶节点(节点 1 和 5)的列表?

感谢您的任何回答!

编辑:

好吧,我有第一个谓词编写和工作:

但是现在,我不知道如何遍历图形并编写叶节点的输出列表。我知道,这很容易,但我没有这种思维和编程方式的经验:(

0 投票
2 回答
1743 浏览

.net - .NET 的最佳 AI 语言/框架是什么?

我正在构建一个包含回合制策略游戏的学术作品。我将 XNA 3 用于图形,但没有决定将什么用于 AI。

我正在考虑使用 P#,一个用于 .NET 的 Prolog 解释器,但我发现它有点差。对于游戏 AI,你有什么比 Prolog(也许是 Haskell?)或比 P# 更好的解释器更好的东西吗?

0 投票
2 回答
4053 浏览

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])没有。

我究竟做错了什么?

0 投票
5 回答
3854 浏览

.net - .Net 的 Prolog 编译器

任何人都可以为.Net推荐一个Prolog编译器。

网上搜到的,好像好几年没更新了。

谢谢

设拉子

0 投票
2 回答
1014 浏览

prolog - 为什么这个 Prolog 谓词有效?

我有以下代码: 请记住,虽然此代码适用于列表,但这些列表表示集合,因此 [1,1,2,2,3,3] 和 [1,2,3] 应该是等效的。

这个想法是 equals([1,2,3],[1,2,1,3]) 应该返回 true。但是,根据上述定义,我期望发生的情况如下:

  1. equals([1,2,3],[1,2,1,3]) 匹配第一条规则,并调用 equals([2,3],[2,1,3]])。
  2. equals([2,3],[2,1,3]]) 匹配第二条规则并调用 contains([2,3], [2,1,3]), contains([2,1,3], [2,3])。
  3. contains([2,3], [2,1,3]) 失败,equals 返回 No。

然而它仍然有效。其他试图混淆它的尝试也是如此。有人可以向我解释一下吗?

(Prolog 实现:SWI-Prolog 版本 2.7.12)

0 投票
1 回答
1561 浏览

prolog - PROLOG 规则仅返回第一个匹配项

我正在尝试在 Prolog 中实现 findall 谓词(是的,我知道它是内置的,这是用于分配的)。

它是这样写的:

出于某种原因,它只给了我第一个解决方案并停在那里,好像第二次调用 my_findall 失败了。据我了解,回溯机制应该遍历所有可能的选项,其中应该包括调用 Pred(N,P) 的所有选项,所以即使第二次调用在第一次尝试时应该失败(为 Pred 尝试的第一个选项已经被断言),它应该在放弃并转到 my_findall(( , ),_, []) 之前先尝试所有其他选项。

如果这不是它的工作原理,有没有办法在不完全重写解决方案的情况下强制这种行为?

0 投票
8 回答
1687 浏览

c# - C#程序员需要学习Prolog、Haskell

我是一名 C# 程序员,在经历了一些关于函数式编程和声明式编程的精彩讨论之后。我觉得我两者都不擅长:P,所以,我正在考虑开始学习 prolog 和 haskell。请建议这样做的可行性。如果我学习 F#,那么学习 Haskell 是否有意义?这些语言将为我提供哪些可以帮助我编写更好的 c# 程序的品质?