问题标签 [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.
algorithm - Prolog - 返回结果而不是在算法中打印
我知道 Prolog 在技术上没有“回报”,但我不知道如何提出这个问题。
我找到了一些用于查找地铁站之间路线的算法的示例代码。它工作得很好,但是它应该只打印结果,因此很难扩展或做一个findall/3
例子。
line
是一个带有一个原子和一个包含站点的列表的谓词。
例如:line(s1, [first_stop, second_stop, third_stop])
所以我要做的是print
在第 11 行去掉它,并在我的规则中添加一个额外的变量来存储结果以供以后使用。但是我失败了,因为无论我尝试什么,它要么进入无限循环,要么返回 false。
现在:
想:
prolog - Prolog 隐藏返回的谓词值
假设我有简单的 hello world 代码
此代码总是返回如下内容:
据我了解prolog,它返回变量值(X 即事实(5,X)。)或真/假,如果谓词可以解决(即事实(5,120)。)。我需要的是在标准输出上隐藏真/假谓词结果(因此只有 writeln() 谓词的结果)。怎么做?谢谢。
list - Prolog:如何调整跟踪中显示的列表的最大长度?
随意跳过前两段,它们大多是在解释情况。
我正在为我的大学课程做一项任务,而我不希望任何帮助解决实际问题(我觉得那是“作弊”)我想帮助找到一种方法来延长显示的列表的长度跟踪时在序言中。例如,在任务中,您必须在迷宫中创建路径查找器,在节点之间使用彩色“边缘”,每个节点都分配有字母表中的唯一字母。边缘是“双向”的,并且有一个“开始”节点也通过红色边缘连接到“m”节点。目标是到达中间的“g”节点,同时以 [red,brown,yellow] 的重复顺序从一开始沿着边缘移动。
无论如何,我认为我的算法在递归的底部找到了一条正确的路线,但是通过示踪剂可能有数千步(我在完成之前按住 return 大约 2 分钟)。目前它不会“返回”生成的步骤列表(虽然我相信你们中的一些人能够告诉我如何这样做,但我宁愿你不这样做,因为我学习实际的序言很重要我自己觉得)所以我唯一一次看到路线步骤列表中的内容是在跟踪中。所以这里是问题:
最终列表包含我想知道它是否有效的路线,但是:
在 j 处截断,我希望跟踪显示完整列表,否则我将不得不返回 100 行跟踪试图在路径中找到分解和“正确”的节点,其中混合了很多回溯,即真的很难,而且真的很容易出错。此外,我正在使用的程序只保留 30 行左右(不知道这是否正常,但我使用的是来自官方网站的 SWI-Prolog(多线程,版本 7.2.3))。这意味着我必须在它第一次到达 j 节点时经历所有事情,这将花费大量时间。
因此,正如我所说,这可以通过将列表统一(或任何名称)作为“回报”(或任何名称)来解决,但我不想要像喂给我的勺子那样的答案,并且会而是自己想办法。所以如果你知道怎么做,请不要告诉我,只是用增加最大显示列表的方法,谢谢。
感谢您的帮助,对于我要求人们跳过的箍感到抱歉。
prolog - 具有无关假解的递归 Prolog 函数
我很难理解为什么fib([1,2],F)
找到第二个解决方案,错误的,具有以下条款和规则:
按照我的逻辑分析fib([1,2],F)
,我应该只是得到结果F = 2
。我需要一些帮助来理解为什么 Prolog 会找到第二种解决方案,即false
.
prolog - 如何在此图探路者的 Prolog 中显示中间步骤?
我在 Prolog 中创建了这个知识库,它反映了一家巴士公司的巴士往返地点,在设定的时间出发和到达:
每当我询问我的知识库是否有两点之间的路线时,它都会返回是否可能;true
或false
:
然而,这不是我想要的。在最好的情况下,我想显示用于在顶层的两点之间创建路线的连接,如下所示:
我该怎么做呢?我想我必须传递一个变量,就像X
我对 testRoute 的调用一样,以便它可以报告它的值。我无法为此编写谓词,因为我不确定将它放在哪里。我的想法是我必须添加一个额外的参数,walk(A,B,Time,V)
但我不知道在那之后我可以用它做什么,以便让它报告路线的中间步骤。
prolog - 如何在prolog中打开通过REPL加载的文件?
在 prolog 中,或者至少在 SWI-Prolog 中,您可以加载文件类型
或者
或者
或者
但是,我想预处理要加载的文件,因此我需要将上述单例列表的内容作为兼容的文件路径,将其用作open/3
. 目前有效的方法:
- 从 REPL 捕获查询的钩子使用
expand_query/4
- 匹配单例列表表达式并将一个元素绑定到变量
什么不起作用:
- 使用 in »2.« 中提到的变量作为
+SrcDest
foropen/3
。
那么如何将准路径处理为真实路径,以使上述 4 种加载模块的方法中的任何一种都有效?
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),这样我就知道哪个谓词被触发了?
database - 将查询结果写入 prolog 中的文件
这是我的序言数据库代码。
我想开始将 prolog 输出保存到文件中。对动态数据库进行一些查询,这些查询应该保存到文件中,然后停止保存查询。它看起来像这样
当我运行这个代码文件时queries.txt
创建。当我运行时,read(Col1, Col2).
我在控制台中看到输出并且文件queries.txt
保持为空。
prolog - 如何在 Prolog 中对输出进行排序?
我有以下谓词:
当我从 REPL 调用它时,它会打印出正确的答案:
但是,对我来说更有用的是根据变量的值对变量进行排序的输出;使用前面的例子,类似的东西[L,M,O,R,V,S], [L,M,O,S,V,R], ...
是理想的。
我希望能够在 REPL 和独立脚本中执行此操作。