为什么这个程序在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行,但我不不明白这是什么意思。
Prolog中的变量_必须是大写。我也认为这里有关于arity和列表的一些混淆。 –
好的大写,我litictly新Prolog语法。关于arity你是什么意思?我的意思是这些列表有任意的意思..请在我给出的链接上看看本书的第9页 – Bento
SWI-Prolog是相当标准的,但是在你已经链接的书中,“代码”示例是**不正确,标准的Prolog语法。如果你是一个绝对的初学者,请尝试类似[Learn Prolog Now!](http://www.learnprolognow.org/lpnpage.php?pageid=online)。 – 2015-10-05 06:59:29