爲什麼這個程序在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