为什么这个程序在SWI-PROLOG中回答错误?
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)?
EDIT2
我注意到在给出命令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行,但我不明白这意味着什么。
答案 0 :(得分:1)
很好,你设法翻译它以纠正Prolog:)
你看到的是顶层试图通过省略东西来使事物可读(...
意味着那里的东西没有显示)。请参阅this question and answers了解您可以告诉顶层显示完整术语而不是隐藏部分内容的不同方法。
对于单例变量警告,它只是告诉您在语法范围内只有一次提到的逻辑变量(在第3行和第9行)。您可以写_X
而不是X
来明确表示您不是使用该范围内变量的值。