问题标签 [prolog-toplevel]

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 回答
480 浏览

algorithm - Prolog - 返回结果而不是在算法中打印

我知道 Prolog 在技术上没有“回报”,但我不知道如何提出这个问题。

我找到了一些用于查找地铁站之间路线的算法的示例代码。它工作得很好,但是它应该只打印结果,因此很难扩展或做一个findall/3例子。

line是一个带有一个原子和一个包含站点的列表的谓词。
例如:line(s1, [first_stop, second_stop, third_stop])

所以我要做的是print在第 11 行去掉它,并在我的规则中添加一个额外的变量来存储结果以供以后使用。但是我失败了,因为无论我尝试什么,它要么进入无限循环,要么返回 false。

现在:

想:

0 投票
0 回答
177 浏览

prolog - Prolog 隐藏返回的谓词值

假设我有简单的 hello world 代码

此代码总是返回如下内容:

据我了解prolog,它返回变量值(X 即事实(5,X)。)或真/假,如果谓词可以解决(即事实(5,120)。)。我需要的是在标准输出上隐藏真/假谓词结果(因此只有 writeln() 谓词的结果)。怎么做?谢谢。

0 投票
1 回答
184 浏览

list - Prolog:如何调整跟踪中显示的列表的最大长度?

随意跳过前两段,它们大多是在解释情况。

我正在为我的大学课程做一项任务,而我不希望任何帮助解决实际问题(我觉得那是“作弊”)我想帮助找到一种方法来延长显示的列表的长度跟踪时在序言中。例如,在任务中,您必须在迷宫中创建路径查找器,在节点之间使用彩色“边缘”,每个节点都分配有字母表中的唯一字母。边缘是“双向”的,并且有一个“开始”节点也通过红色边缘连接到“m”节点。目标是到达中间的“g”节点,同时以 [red,brown,yellow] 的重复顺序从一开始沿着边缘移动。

无论如何,我认为我的算法在递归的底部找到了一条正确的路线,但是通过示踪剂可能有数千步(我在完成之前按住 return 大约 2 分钟)。目前它不会“返回”生成的步骤列表(虽然我相信你们中的一些人能够告诉我如何这样做,但我宁愿你不这样做,因为我学习实际的序言很重要我自己觉得)所以我唯一一次看到路线步骤列表中的内容是在跟踪中。所以这里是问题:

最终列表包含我想知道它是否有效的路线,但是:

在 j 处截断,我希望跟踪显示完整列表,否则我将不得不返回 100 行跟踪试图在路径中找到分解和“正确”的节点,其中混合了很多回溯,即真的很难,而且真的很容易出错。此外,我正在使用的程序只保留 30 行左右(不知道这是否正常,但我使用的是来自官方网站的 SWI-Prolog(多线程,版本 7.2.3))。这意味着我必须在它第一次到达 j 节点时经历所有事情,这将花费大量时间。

因此,正如我所说,这可以通过将列表统一(或任何名称)作为“回报”(或任何名称)来解决,但我不想要像喂给我的勺子那样的答案,并且会而是自己想办法。所以如果你知道怎么做,请不要告诉我,只是用增加最大显示列表的方法,谢谢。

感谢您的帮助,对于我要求人们跳过的箍感到抱歉。

0 投票
3 回答
3196 浏览

prolog - Prolog:获取变量的所有可能值

我正在关注 Prolog 教程 2.1

程序

打印2

但它应该根据教程打印可能值的列表:

我在 repl 中再次尝试只是为了得到相同的结果:

如何获取/打印变量的可能值列表?

0 投票
1 回答
52 浏览

prolog - 具有无关假解的递归 Prolog 函数

我很难理解为什么fib([1,2],F)找到第二个解决方案,错误的,具有以下条款和规则:

按照我的逻辑分析fib([1,2],F),我应该只是得到结果F = 2。我需要一些帮助来理解为什么 Prolog 会找到第二种解决方案,即false.

0 投票
2 回答
271 浏览

prolog - 如何在此图探路者的 Prolog 中显示中间步骤?

我在 Prolog 中创建了这个知识库,它反映了一家巴士公司的巴士往返地点,在设定的时间出发和到达:

每当我询问我的知识库是否有两点之间的路线时,它都会返回是否可能;truefalse

然而,这不是我想要的。在最好的情况下,我想显示用于在顶层的两点之间创建路线的连接,如下所示:

我该怎么做呢?我想我必须传递一个变量,就像X我对 testRoute 的调用一样,以便它可以报告它的值。我无法为此编写谓词,因为我不确定将它放在哪里。我的想法是我必须添加一个额外的参数,walk(A,B,Time,V)但我不知道在那之后我可以用它做什么,以便让它报告路线的中间步骤。

0 投票
0 回答
70 浏览

prolog - 如何在prolog中打开通过REPL加载的文件?

在 prolog 中,或者至少在 SWI-Prolog 中,您可以加载文件类型

或者

或者

或者

但是,我想预处理要加载的文件,因此我需要将上述单例列表的内容作为兼容的文件路径,将其用作open/3. 目前有效的方法:

  1. 从 REPL 捕获查询的钩子使用expand_query/4
  2. 匹配单例列表表达式并将一个元素绑定到变量

什么不起作用:

  • 使用 in »2.« 中提到的变量作为+SrcDestfor open/3

那么如何将准路径处理为真实路径,以使上述 4 种加载模块的方法中的任何一种都有效?

0 投票
1 回答
80 浏览

prolog - 找出在 prolog 文件中触发的规则

我有一个序言文件,它用给定的背景事实对给定的谓词 bongard(A, X) 进行分类。规则片段:

我正在执行这个程序,如下所示:swipl -s file.pl -g "bongard(a, X), write(X)",以获得该谓词的分类。

现在我还想知道哪个规则触发并实际限制了变量。有什么巧妙的方法可以做到这一点吗?现在我需要为具有 n 个规则的原始 prolog 文件保留额外的 n 个文件。File1 有第一条规则,file2 有前两条规则。你明白了。这样,如果 File2 对规则进行分类,我知道第二条规则被触发。

有没有人对此有更好的建议?

编辑:给谓词一个唯一的数字“bongard(A,X,nr)”怎么样,然后我可以同时写(X)和写(Nr),这样我就知道哪个谓词被触发了?

0 投票
1 回答
665 浏览

database - 将查询结果写入 prolog 中的文件

这是我的序言数据库代码。

我想开始将 prolog 输出保存到文件中。对动态数据库进行一些查询,这些查询应该保存到文件中,然后停止保存查询。它看起来像这样

当我运行这个代码文件时queries.txt创建。当我运行时,read(Col1, Col2).我在控制台中看到输出并且文件queries.txt保持为空。

0 投票
1 回答
241 浏览

prolog - 如何在 Prolog 中对输出进行排序?

我有以下谓词:

当我从 REPL 调用它时,它会打印出正确的答案:

但是,对我来说更有用的是根据变量的值对变量进行排序的输出;使用前面的例子,类似的东西[L,M,O,R,V,S], [L,M,O,S,V,R], ...是理想的。

我希望能够在 REPL 和独立脚本中执行此操作。