2015-10-05 221 views
0

为什么这个程序在SWI-PROLOG中回答False?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,由劳埃德(你可以找到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). 

更改查询嘛,序言现在成功了,但它给了这个替代

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行,但我不不明白这是什么意思。

+2

Prolog中的变量_必须是大写。我也认为这里有关于arity和列表的一些混淆。 –

+0

好的大写,我litictly新Prolog语法。关于arity你是什么意思?我的意思是这些列表有任意的意思..请在我给出的链接上看看本书的第9页 – Bento

+1

SWI-Prolog是相当标准的,但是在你已经链接的书中,“代码”示例是**不正确,标准的Prolog语法。如果你是一个绝对的初学者,请尝试类似[Learn Prolog Now!](http://www.learnprolognow.org/lpnpage.php?pageid=online)。 – 2015-10-05 06:59:29

回答

1

大,你设法翻译改正的Prolog :)

你看到的是顶层试图让事情可读省略的东西(的...意味着有东西存在未显示)。有关不同的方式,请参阅this question and answers,您可以告诉顶层显示完整的术语而不是隐藏其中的一部分。

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

+0

感谢你和丹尼尔,他在某种程度上照亮了我关于理性问题的看法。所以singleton只是一个警告(就像你在声明一个变量而不使用它时 - 也许是一个遗忘)那样的传统命令式语言,告诉你一些逻辑上的东西可能会有问题(我的例子不是这样)。 Prolog语言/编译器的技术问题,与理论对应物无关。 – Bento