2014-12-07 58 views
1

我遇到了這個question,有人可以生成從低到高的一系列數字。Prolog數字範圍

我是prolog的新手,所以我很難理解解決方案的工作原理。所以我想知道如果有人願意通過它如何適用於我。

更具體地說,我很難理解回溯以及Prolog解釋器如何獲得解決方案。

我也想知道我怎麼可以創建一個謂語像 範圍(上,K)....

這樣,當我打電話

範圍(5,K)。 K = 1; K = 2; 。 。 K = 5;

爲清晰起見進行了編輯。

+0

在Prolog中,您不使用函數,但使用描述關係的謂詞。謂詞可以是真或假,它們不返回任何東西。所以你的第二個問題的答案是否。 – 2014-12-07 18:49:36

+0

看看這個問題,它可能會回答你的問題。 http://stackoverflow.com/questions/18337235/can-you-write-between-3-in-pure-prolog – 2014-12-07 18:53:06

+0

對不起,我的無知。我更新了我的問題,以便更清楚地知道我在問什麼。 – user2327195 2014-12-07 19:04:04

回答

1

對於您的range(+U, -K)最好的答案是使用between/3內置謂詞。但這裏有一個可能的實現:

range(_, 1). 
range(U, K):- range(U, K1), (K1 >= U, !, false ; K is K1+1). 

有比這更好的解決方案,但我認爲這是很好的用於解釋。這不是完美的,因爲給予否定的U會給你一個錯誤的解決方案,但是你可以從這裏開始完美。

一個例子

假設你運行下面的查詢:

?- range(2, K). 

的Prolog將試圖通過尋找規則,其首長將與它相結合,以滿足給定的目標。可以使用第一條規則(range(_, 1)),並創建選擇點,因爲有可供選擇的方式(即第二條規則)。所以,因爲匿名變量_ 2個1相結合與統一K,你得到你的第一個答案:

K = 1 ; 

現在的Prolog回溯到上上之選點,並嘗試使用第二個規則,以滿足range(2, K)。它是通過統一U 2,你的變量K從規則變量K並把對目標的條件棧現在看起來是這樣的:

range(2, K1), (K1 >= 2, !, false ; K is K1 + 1) 

爲了滿足第一個目標,Prolog的考慮第一條規則並創建一個選擇點。 K1被實例化,以1和的目標棧變爲:現在

(1 >= 2, !, false ; K is 1 + 1) 

,因爲有一個或運營商(;),Prolog的會盡量滿足第一組的子目標,並在這裏建立anothe選擇點。但是,1>=2是錯誤的,所以它回溯到最後一個選擇點,並試圖通過將K實例化爲2來滿足K is 1 + 1。因此,你會得到你的第二個結果是:

K = 2 ; 

序言現在回溯到了range(2, K1)創建的選擇點,並使用第二條規則。目標堆棧變爲:

range(2, K2), (K2 >= 2, !, false ; K1 is K2+1), (K1 >= 2, !, false ; K is K1 + 1) 

再次,Prolog的嘗試使用與1結合K2並創建一個選擇點的第一個規則,以滿足range(2, K2)

(1 >= 2, ! false ; K1 is 1+1), (K1 >= 2, !, false ; K is K1+1) 

現在Prolog有因或操作員兩個備選方案,但作爲1 >= 2是假的第一個失敗。第二個是滿意K1被實例化,以2

(2 >= 2, !, false ; K is 2 + 1) 

現在,Prolog的創建一個選擇點,採取第一套目標(2 >= 2, !, false),並試圖滿足他們。 2>=2是真實的,然後裁剪運算符(!)銷燬所有先前的選擇點。 false爲false並停止執行。

+0

非常好的解釋。感謝您花時間。 :) – user2327195 2014-12-07 20:08:05