问题标签 [swi-prolog-for-sharing]
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 中并在以后使用?
假设我想编写一个比较两个值的谓词(当然是不必要的,但它是一个示例),并将结果作为可以引用的变量返回,如下所示:
但是在Swish中我得到一个错误:
在我拥有 之后Result
,我将如何在另一个谓词中使用它的值?能不能说:
还是我完全误解了 Prolog 的哲学?
prolog - 如何手动运行 Prolog 程序并在编译器上验证它?
我正在通过 Prolog 学习逻辑,我想知道如何管理 Prolog 分辨率。
让我们成为以下 Prolog 程序:
给出此代码给出的排序结果。
- =6+4:-p(U,U,V), write('Test1: ',U,'',V),nl,失败。
X|U(X 变成了 U)我必须转换所有变量吗?
Y|V(Y 变成了 V)
- =7+1:- write('Test1: ',a,' ',b) ,nl,失败。
U|a (U 变成了 a)
V|b(V变成了b)
=:-nl,失败。
=:-失败。
所以我必须达到最后一个没有错的命题,也就是说,在 7 处使用 3,因为 2 似乎在那里用 a 和 c 代替 X 不起作用。
- =7+3:-写 ('Test1: ', c,' ',c) ,nl,fail.
U|c
V|c
=:-nl,失败。
=:-失败。
至于没有以下不会失败的命题,我必须去5。
- =5+1:-p(U,V,V),write('Test2: ', U,' ',V),nl,失败。
U|a
V|c
=14+2:- write('Test2: ', a,' ',c) ,nl,失败。
=:-nl,失败。
=:-失败。
=14+3:- write('Test2: ', c,' ',c) ,nl,失败。
...转到一个空子句...
因此我应该有
测试1:ab
测试1:ab
测试2:交流
测试2:抄送
但是,我在 SWISH 上有一个错误:
因此,您能帮我理解如何手动运行 Prolog 程序并在编译器上验证它吗?此外,在执行 X|U(X 已变为 U)时,我是否必须转换所有变量?最后,Prolog 何时被视为结束?
prolog - Swish 导入 RDF
是否可以将 rdf 文件从 URL 导入 Swish?
即类似的东西:
myload:- load_rdf('www.myrdf.com').
然后我可以查询?-rdf(A,B,C)
prolog - 读一剪!在序言中
我正在阅读Learn Prolog Now!的关于削减的章节以及 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如
然而,正如下面所述,如果所有变量都被实例化,即使我们期望,该代码也会失败false
,例如
原因很清楚:第一个规则失败,第二个规则不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是嗖嗖声):
我很困惑我应该如何阅读这个。我!
的意思是:'如果在此之前的所有内容!
都是真实的,请停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着实例化Y = Z
仅在失败的情况下发生,这对于该规则是无用的。
那么应该如何以“人类”的方式阅读剪辑呢?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3
?
prolog - 如何使用 clp(fd) 绑定所有组合 prolog 搜索?
我想做的是从给定列表中生成元素的所有组合。例如:从 [a,b,c],我可能想要:
等等。也许有一个神奇的序言单线可以做到这一点。如果是这样,我很想听听。
但是,我的问题与其说是解决这个特定问题,不如说是请求有人为我解释 Prolog 搜索算法的一些微妙之处。
所以这是我首先解决上述问题的方法:
这很好用,但会返回所有可能的结果,而且顺序不是很好:
好的,这没问题。我真的只是想要所有组合达到一定的长度。所以我决定首先得到具有特定长度的那些:
这很好用,例如长度为 2:
等等。现在,我尝试使用 clpfd 来利用上述函数来使所有列表达到一定长度,但结果出错了:
一类的作品。找到正确的结果(长度小于 Bound 的列表)。但是在找到它们之后,它会不断循环搜索更多结果。例如长度 2:
我想这是我问题的核心。有人可以解释为什么(根据跟踪)prolog 继续检查越来越大的列表作为可能的解决方案,即使它们都注定要失败?有人可以告诉我是否有办法帮助 prolog 避免这个注定的旅程?
我最终使用下面的代码解决了这个问题,但是我很失望我无法弄清楚如何使用 clpfd 的整数约束来约束列表的大小。
以下是关于 SWISH 的所有相关代码:http: //swish.swi-prolog.org/p/allcombos.pl
prolog - 在 Prolog 中使用写入谓词时出错
我正在探索 Prolog 中的写谓词,但它有时表现不同。我确实浏览了一些帖子,但我无法发现问题。
谓词:
询问:
结果 :
上面的代码工作正常,但是当我向写谓词(Element)添加一个参数时,它给出了一个错误。
谓词:
询问:
错误:
请帮助我为什么会出现这种异常情况。PS 我也看到了 write 的文档,但不能从中得到太多。任何帮助是极大的赞赏。
prolog - SWI-Prolog (SWISH):无权修改静态过程 `(=)/2'
在玩弄 SWI-Prolog (SWISH) 中不同的列表谓词时,我试图检查一个原子a
是否是List1
我在程序中定义为List1 = [a,b,c,d]
.
我将我的查询表述为member(a, List1).
,期待类似于简单的“是”的内容(正如它在 59:25 的这个youtube 视频中显示的那样),但是我收到了一个警告
单例变量:[List1]
和一个错误
无权修改静态过程 `(=)/2'
根据我在网上查找的了解,这里的警告并不重要。但是,我不明白为什么我a
显然是List1
.
我尝试了两种不同的方式:
1)通过添加List1 = [a,b,c,d].
到程序并查询member(a,List1).
(导致上述错误);
2)List1 = [a,b,c,d]
直接传递给解释器,然后使用相同的member(a,List1).
查询a
(
这是关于我正在使用的特定 Prolog 版本的问题,还是我错过了一些非常简单的东西?
编辑
我知道这里提出了一个类似的问题,但我没有完全理解答案(也不是问题),因为它立即dynamic
涉及我在 Prolog 中尚未遇到的事情。我正在寻找一个更普遍、更“高级”的答案,我通过提出这个问题找到了这个答案。
sorting - Prolog 递归和变量
我有这个插入排序来在 Prolog 中按降序对列表进行排序,它可以工作:
我在 SWISH 上运行它,并试图通过以下跟踪了解它的功能:
一旦我越过第一个“出口”,我就会迷路。我理解所有的递归调用,直到我们到达一个空列表,它会因为另一个事实而停止递归调用并开始返回,但是为什么在第 7 行的第一次退出之后,未定义的 STail 变成了一个空列表 []插入调用?
ins_sort([], []) 的退出是否将 STail 设置为空集 [],这是否意味着事实的最后一个参数是返回值或其他什么?
prolog - 二项式系数 [序言]
为什么它返回假?
任务是:使用以下公式编写递归程序C(M,N) (0 ≤ m ≤ n )
以找出二项式系数:
PS:我使用在线编译器 SWISH。