SWI Prolog的排序程序

时间:2015-10-05 06:01:06

标签: prolog

为什么这个程序在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行,但我不明白这意味着什么。

1 个答案:

答案 0 :(得分:1)

很好,你设法翻译它以纠正Prolog:)

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

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