2011-01-09 12 views
0

我有一套排名順序的公司。我希望我的規則能夠檢查指定列表中的公司是否按排名順序排列,以及規則是否重複,直到列表中的所有公司都已經過檢查。如何製作檢查公司排名的遞歸列表?

目前,我有以下幾點:

isOrder([]). 
isOrder([COM1,COM2|T]) :- 
    rank(COM1,D), rank(COM2,E), 
    D<E, 
    print("in order"), 
    isOrder([COM2|T]). 

然而,這似乎並沒有工作。有時,遞歸會一直持續下去,而不會結束,有時候遞歸根本不起作用。這是我改變代碼以嘗試獲得正確答案的時候。

任何人都可以幫助我嗎?我剛開始使用Prolog,我的理解受到嚴重限制。任何幫助將不勝感激。

回答

0

在Prolog它有遞歸右邊的「基地」的情況下,以及獲得的遞歸自身權利的規則是很重要的。

在這裏,我想你想的基本情況,從isOrder([])來isOrder改變([_]),或許有這兩種。

你擁有的第一條現在看起來像它會爲一個空列表,我想沒有任何傷害返回true。但是第二個條款永遠不能將非空列表減少爲空列表。它只適用於至少有兩個項目(公司)的列表,並將這種情況縮減爲至少包含一個項目的列表。

所以,增加一個條款isOrder([_]),它說你成功了,如果列表中只有一個項目,並讓我們知道它是如何工作!

+1

不僅爲空單的條款「不傷害」,它匹配(邏輯)的真理,一個空列表(平凡)訂購。 – 2011-01-09 18:49:40

1

的問題是,你的程序有一個元素的列表中沒有的情況:第一種情況處理空列表,而第二隻匹配與兩個或多個元素的列表。

你需要添加一個條款

isOrder([_]).