我遇到了這個question,有人可以生成從低到高的一系列數字。Prolog數字範圍
我是prolog的新手,所以我很難理解解決方案的工作原理。所以我想知道如果有人願意通過它如何適用於我。
更具體地說,我很難理解回溯以及Prolog解釋器如何獲得解決方案。
我也想知道我怎麼可以創建一個謂語像 範圍(上,K)....
這樣,當我打電話
範圍(5,K)。 K = 1; K = 2; 。 。 K = 5;
爲清晰起見進行了編輯。
我遇到了這個question,有人可以生成從低到高的一系列數字。Prolog數字範圍
我是prolog的新手,所以我很難理解解決方案的工作原理。所以我想知道如果有人願意通過它如何適用於我。
更具體地說,我很難理解回溯以及Prolog解釋器如何獲得解決方案。
我也想知道我怎麼可以創建一個謂語像 範圍(上,K)....
這樣,當我打電話
範圍(5,K)。 K = 1; K = 2; 。 。 K = 5;
爲清晰起見進行了編輯。
對於您的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並停止執行。
非常好的解釋。感謝您花時間。 :) – user2327195 2014-12-07 20:08:05
在Prolog中,您不使用函數,但使用描述關係的謂詞。謂詞可以是真或假,它們不返回任何東西。所以你的第二個問題的答案是否。 – 2014-12-07 18:49:36
看看這個問題,它可能會回答你的問題。 http://stackoverflow.com/questions/18337235/can-you-write-between-3-in-pure-prolog – 2014-12-07 18:53:06
對不起,我的無知。我更新了我的問題,以便更清楚地知道我在問什麼。 – user2327195 2014-12-07 19:04:04