2010-11-15 160 views
1

我想按長度比較兩個列表,並將輸出設置爲true或false。比較兩個列表?

min(List1, List2, output) :- 
    length(List1, N), 
    length(List2, M), 
     output is N<M. 

但我不斷收到錯誤,列表的語法是什麼?

回答

3

這裏有一些問題; @Enigmativity是正確的,因爲您需要使Output變量,但is/2未在運算符<上定義(它用於評估算術表達式,如+those that are user defined)。

相反,考慮以下幾點:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    (N < M -> 
     Output = 'true' 
    ; Output = 'false' 
    ). 

這裏,N < M邏輯測試其成功或失敗。 如果N < M是真實的,寓意->指導解釋到Output變量綁定到原子'true'其他'false',表明你問的列表之間的長度的關係。你可以在這裏綁定任何東西,不僅僅是原子。

執行這給:

?- min([1,2,3,4],[1,2],Output). 
Output = false. 

如果你想min/3只返回兩個輸入列表的小,你可以嘗試:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    (N < M -> 
     Output = List1 
    ; Output = List2 
    ). 

上相同的例子執行此給出:

?- min([1,2,3,4],[1,2],X). 
X = [1, 2]. 
+0

您忘記了更新'長度=(> =)。' – Kaarel 2010-11-15 10:01:48

+0

@卡雷爾,謝謝,很好的發現;我現在已經做到了一致。 – sharky 2010-11-15 10:13:45

+0

感謝您的解釋。 – 2010-11-16 18:36:01

-1

這裏的簡單變化是:

min(List1, List2, Output) :- 
    length(List1, N), 
    length(List2, M), 
    Output is N<M. 

Output是一個變量,而不是一個名詞,所以它應該有一個大寫字母開頭。

這是否解決您的問題?

+0

不,它給了我一個未定義的過程錯誤,當我做這樣的事情時: – 2010-11-15 02:56:42

+0

min([1,2,3,4],[1,2],X)。 – 2010-11-15 02:57:09

0

這可能會比解決方案運行得更快, re是一個很小且很大的列表(因爲它會在達到最小列表的末尾時立即停止)。

min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !. 
min_list(_, [], false). 
min_list([], _, true). 

關於列表語法所有你需要知道的是,名單表示爲[Head|Tail],其中Head是列表和Tail含有其餘元素的子列表的第一個元素。

!切割操作避免回溯探索其他解決方案(如果你不使用它在那裏,系統會等待您按下分號,如果你想另外一個答案,然後它會說false)。

未使用的謂詞變量表示爲下劃線(否則您將收到關於單例變量的警告)。