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

0 投票
2 回答
903 浏览

prolog - 在 SWI-Prolog swish 中使用插入谓词?

我正在尝试执行看似简单的三行代码

但由于某种原因,我无法让它在许多在线代码编译器上编译或执行SWISHIDEone等。问题似乎是“插入”不是一个公认的谓词。我尝试了一些谷歌搜索,但似乎没有任何内容可供插入。谢谢!(对不起,Prolog 很新)

编辑:似乎非ASCII字符存在问题。这导致错误错误:/home/F3Vzlp/prog:10:21:语法错误:操作员预期错误:/home/F3Vzlp/prog:11:21:语法错误:操作员预期

0 投票
1 回答
607 浏览

prolog - 如何将比较结果存储在 Prolog 中并在以后使用?

假设我想编写一个比较两个值的谓词(当然是不必要的,但它是一个示例),并将结果作为可以引用的变量返回,如下所示:

但是在Swish中我得到一个错误:

在我拥有 之后Result,我将如何在另一个谓词中使用它的值?能不能说:

还是我完全误解了 Prolog 的哲学?

0 投票
0 回答
446 浏览

prolog - 如何手动运行 Prolog 程序并在编译器上验证它?

我正在通过 Prolog 学习逻辑,我想知道如何管理 Prolog 分辨率。

让我们成为以下 Prolog 程序:

给出此代码给出的排序结果。

  1. =6+4:-p(U,U,V), write('Test1: ',U,'',V),nl,失败。

X|U(X 变成了 U)我必须转换所有变量吗?

Y|V(Y 变成了 V)

  1. =7+1:- write('Test1: ',a,' ',b) ,nl,失败。

U|a (U 变成了 a)

V|b(V变成了b)

  1. =:-nl,失败。

  2. =:-失败。

所以我必须达到最后一个没有错的命题,也就是说,在 7 处使用 3,因为 2 似乎在那里用 a 和 c 代替 X 不起作用。

  1. =7+3:-写 ('Test1: ', c,' ',c) ,nl,fail.

U|c

V|c

  1. =:-nl,失败。

  2. =:-失败。

至于没有以下不会失败的命题,我必须去5。

  1. =5+1:-p(U,V,V),write('Test2: ', U,' ',V),nl,失败。

U|a

V|c

  1. =14+2:- write('Test2: ', a,' ',c) ,nl,失败。

  2. =:-nl,失败。

  3. =:-失败。

  4. =14+3:- write('Test2: ', c,' ',c) ,nl,失败。

  5. ...转到一个空子句...

因此我应该有

测试1:ab

测试1:ab

测试2:交流

测试2:抄送

但是,我在 SWISH 上有一个错误:

因此,您能帮我理解如何手动运行 Prolog 程序并在编译器上验证它吗?此外,在执行 X|U(X 已变为 U)时,我是否必须转换所有变量?最后,Prolog 何时被视为结束?

0 投票
1 回答
85 浏览

prolog - Swish 导入 RDF

是否可以将 rdf 文件从 URL 导入 Swish?

即类似的东西:

myload:- load_rdf('www.myrdf.com').

然后我可以查询?-rdf(A,B,C)

0 投票
2 回答
3474 浏览

prolog - 读一剪!在序言中

我正在阅读Learn Prolog Now!的关于削减的章节以及 Bratko 的人工智能 Prolog 编程,第 5 章:控制回溯。起初,cut 似乎是模仿其他编程语言中已知的 if-else 子句的直接方式,例如

然而,正如下面所述,如果所有变量都被实例化,即使我们期望,该代码也会失败false,例如

原因很清楚:第一个规则失败,第二个规则不再有任何条件与之相关,所以它会成功。我明白这一点,但随后提出了一个解决方案(这里是嗖嗖声):

我很困惑我应该如何阅读这个。我!的意思是:'如果在此之前的所有内容!都是真实的,请停止终止,包括具有相同谓词的任何其他规则'。但是,这不可能是正确的,因为这意味着实例化Y = Z仅在失败的情况下发生,这对于该规则是无用的。

那么应该如何以“人类”的方式阅读剪辑呢?而且,作为扩展,我应该如何阅读上述建议的解决方案max/3

0 投票
1 回答
219 浏览

prolog - 如何使用 clp(fd) 绑定所有组合 prolog 搜索?

我想做的是从给定列表中生成元素的所有组合。例如:从 [a,b,c],我可能想要:

等等。也许有一个神奇的序言单线可以做到这一点。如果是这样,我很想听听。

但是,我的问题与其说是解决这个特定问题,不如说是请求有人为我解释 Prolog 搜索算法的一些微妙之处。

所以这是我首先解决上述问题的方法:

这很好用,但会返回所有可能的结果,而且顺序不是很好:

好的,这没问题。我真的只是想要所有组合达到一定的长度。所以我决定首先得到具有特定长度的那些:

这很好用,例如长度为 2:

等等。现在,我尝试使用 clpfd 来利用上述函数来使所有列表达到一定长度,但结果出错了:

一类的作品。找到正确的结果(长度小于 Bound 的列表)。但是在找到它们之后,它会不断循环搜索更多结果。例如长度 2:

我想这是我问题的核心。有人可以解释为什么(根据跟踪)prolog 继续检查越来越大的列表作为可能的解决方案,即使它们都注定要失败?有人可以告诉我是否有办法帮助 prolog 避免这个注定的旅程?

我最终使用下面的代码解决了这个问题,但是我很失望我无法弄清楚如何使用 clpfd 的整数约束来约束列表的大小。

以下是关于 SWISH 的所有相关代码:http: //swish.swi-prolog.org/p/allcombos.pl

0 投票
1 回答
4486 浏览

prolog - 在 Prolog 中使用写入谓词时出错

我正在探索 Prolog 中的写谓词,但它有时表现不同。我确实浏览了一些帖子,但我无法发现问题。

谓词:

询问:

结果 :

上面的代码工作正常,但是当我向写谓词(Element)添加一个参数时,它给出了一个错误。

谓词:

询问:

错误:

请帮助我为什么会出现这种异常情况。PS 我也看到了 write 的文档,但不能从中得到太多。任何帮助是极大的赞赏。

0 投票
1 回答
1071 浏览

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 中尚未遇到的事情。我正在寻找一个更普遍、更“高级”的答案,我通过提出这个问题找到了这个答案。

0 投票
3 回答
1088 浏览

sorting - Prolog 递归和变量

我有这个插入排序来在 Prolog 中按降序对列表进行排序,它可以工作:

我在 SWISH 上运行它,并试图通过以下跟踪了解它的功能:

一旦我越过第一个“出口”,我就会迷路。我理解所有的递归调用,直到我们到达一个空列表,它会因为另一个事实而停止递归调用并开始返回,但是为什么在第 7 行的第一次退出之后,未定义的 STail 变成了一个空列表 []插入调用?

ins_sort([], []) 的退出是否将 STail 设置为空集 [],这是否意味着事实的最后一个参数是返回值或其他什么?

0 投票
1 回答
721 浏览

prolog - 二项式系数 [序言]

为什么它返回假?

任务是:使用以下公式编写递归程序C(M,N) (0 ≤ m ≤ n )以找出二项式系数:

PS:我使用在线编译器 SWISH。