【发布时间】: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