【问题标题】:Sorting program for SWI PrologSWI Prolog 的排序程序
【发布时间】:2016-01-01 17:27:36
【问题描述】:

为什么这个程序在 SWI-PROLOG 中回答 False?

sor(x, y):- sorted(y), perm(x, y).
sorted([]).
sorted([x, []]).
sorted([x, y, z]):- mi(x, y), sorted([y, z]).
perm([], []).
perm([x,y],[u,v]):- delete(u,[x,u],z), perm(z,v).
delete(x,[x,y],y].
delete(x, [y, z], [y, w]):- delete(x,z,w).
mi(0, x).
mi(s(x), s(y)):- mi(x, y).

对于查询?-

sor([s(s(s(s(s(0))))), s(s(s(s(s(s(0)))))), s(s(s(0))), s(s(0)), []], y).

这是对 SWIProlog 的改编,该程序在 Loyd 的 逻辑编程基础 一书中用作示例(您可以在 this pdf 中找到原始的 SLOWSORT 程序示例)第 9 页)

SWI Prolog 是标准的 Prolog,不是吗?

编辑

现在我尝试更正程序(稍微看一下 Prolog 中的列表语法)

sor(X, Y):- perm(X, Y), sorted(Y).
sorted([]).
sorted([X|[]]).
sorted([X|[Y|Z]]):- mi(X, Y), sorted([Y|Z]).
perm([], []).
perm([X|Y],[U|V]):- delete(U,[X|Y],Z), perm(Z, V).
delete(X,[X|Y],Y). 
delete(X, [Y|Z], [Y|W]):- delete(X, Z, W).
mi(0, X).
mi(s(X), s(Y)):- mi(X, Y).

并更改查询

sor([s(s(s(s(s(0)))))|[ s(s(s(s(s(s(0))))))|[s(s(s(0)))|[ s(s(0))|[]]]]], Y).

好吧,Prolog 现在成功了,但它提供了这种替代

Y = [s(s(0)), s(s(s(0))), s(s(s(s(s(0))))), s(s(s(s(s(s(...))))))]

我不明白 (...) 的含义:为什么不是 (0)?

编辑2

我注意到在给出命令 swipl -s slowsort.pl 后我得到了这个错误信息

Warning: /home/navigazione/Scrivania/slowsort.pl:3:
Singleton variables: [X]
Warning: /home/navigazione/Scrivania/slowsort.pl:9:
Singleton variables: [X]

好像是指程序的第3行和第9行,但是我不明白是什么意思。

【问题讨论】:

  • Prolog 中的变量必须为大写。我也认为这里有一些关于 arity 和列表​​的混淆。
  • 好吧,大写,我对 Prolog 语法完全陌生。关于arity,你是什么意思?我的意思是这些列表具有任意性。请在我提供的链接中查看本书的第 9 页
  • SWI-Prolog 非常标准,是的,但是在您链接的书中,“代码”示例正确,标准 Prolog 语法。如果您是绝对初学者,请尝试使用 Learn Prolog Now! 之类的方法。
  • 是的,查看您链接的 PDF,这不会教您如何在 Prolog 中编程。它是关于逻辑编程的理论。
  • @Boris,几个小时前我发现了那个有趣的网站,我快速浏览了一些我感兴趣的点,但现在它们似乎还不够。

标签: prolog


【解决方案1】:

太好了,你设法将它翻译成正确的 Prolog :)

您看到的是顶层试图通过省略某些内容来使内容可读(... 表示那里有未显示的内容)。请参阅 this question and answers 了解您可以告诉顶层显示完整术语而不是隐藏部分的不同方法。

至于单例变量警告,它只是告诉您有逻辑变量(在第 3 行和第 9 行),您在其语法范围内只提到过一次。您可以写 _X 而不是 X 以明确表明您没有使用该范围内的变量值。

【讨论】:

  • 感谢您和 Daniel,他们以某种方式启发了我关于 arity 问题的知识。所以单例只是一个警告(就像在传统命令式语言中当你声明一个变量而不使用它时的那种警告——也许是一种忘记)告诉你在逻辑基础上的某些事情可能是有问题的(我的例子不是这种情况)。 Prolog 语言/编译器的技术问题,与理论对应物没有关联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多