2015-10-05 222 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