2013-05-27 42 views
1

我試圖在prolog中創建一個謂詞,如果它到達一組值的最低數值,它將保持爲真。Prolog迭代/遞歸向下鑽取到最低值

例如:
我有這樣的事情,此刻

基本步驟

lowest(Object, Value) :- \+ lessThan(Object, Value, NewValue). 

遞歸步驟

lowest(Object, Value) :- lessThan(Object, Value, NewValue), lowest(Object, NewValue). 

如果對象是一些抽象的對象,它可以有多個數值附加值。
lessThan返回小於輸入值的Object的值(NewValue)。

而且由於NewValue 低於值的輸入我可以假設每個遞歸步驟的值都會減少。

我已經提取從另一個我正努力解決這個問題,但基本上所發生的事情是,我期望從整個遞歸函數只有2個輸出,而是我得到儘可能多的產出爲lessThan(Object, Initial, X) + 2

我不確定這個問題是否清楚,請讓我知道,這樣我可以澄清。

我相信我的基礎步驟是正確的,因爲我假設如果Value是與Object最低的耦合,那麼沒有其他值小於Value。

我不確定在哪裏也可以終止遞歸,這增加了我的困惑。我的猜測是,一旦它達到沒有較低的對象值的狀態,它就會終止。

+0

通話'allLessThan(對象,價值的NewValue)'如果成功,把一個值的NewValue,這比價值的小嗎?如果是這樣,爲什麼叫「全部......」? –

+0

好點,我想我可以使用它了;以交互方式返回(或打印出)'所有'值低於值(並且對於每次迭代,NewValue都會保留新的較低值)。然而,這只是我提出來抽象真正的問題,我現在要改變它。 – Antix

回答

0

這個示例應該工作,根據您的域名重新命名值/ 2。

value(a, 10). 
value(a, 3). 
value(a, 100). 

lowest(Object, L) :- 
    value(Object, First), !, lowest(Object, First, L). 
lowest(Object, LowestSoFar, Lowest) :- 
    value(Object, Try), Try < LowestSoFar, !, 
    lowest(Object, Try, Lowest). 
lowest(_, Lowest, Lowest). 

它產生

?- lowest(a,X). 
X = 3. 

。注意,重複值 '偷看' 的每個時間,然後是沒有效率。 可能的替代方法是存儲較低的值並運行失敗驅動的循環。 否則,SWI-Prolog的(和YAP)有圖書館(aggregate):

?- aggregate(min(V), value(a,V), M). 
M = 3.