我想按長度比較兩個列表,並將輸出設置爲true或false。比較兩個列表?
min(List1, List2, output) :-
length(List1, N),
length(List2, M),
output is N<M.
但我不斷收到錯誤,列表的語法是什麼?
我想按長度比較兩個列表,並將輸出設置爲true或false。比較兩個列表?
min(List1, List2, output) :-
length(List1, N),
length(List2, M),
output is N<M.
但我不斷收到錯誤,列表的語法是什麼?
這裏有一些問題; @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].
這裏的簡單變化是:
min(List1, List2, Output) :-
length(List1, N),
length(List2, M),
Output is N<M.
Output
是一個變量,而不是一個名詞,所以它應該有一個大寫字母開頭。
這是否解決您的問題?
不,它給了我一個未定義的過程錯誤,當我做這樣的事情時: – 2010-11-15 02:56:42
min([1,2,3,4],[1,2],X)。 – 2010-11-15 02:57:09
這可能會比解決方案運行得更快, re是一個很小且很大的列表(因爲它會在達到最小列表的末尾時立即停止)。
min_list([_|L1t], [_|L2t], Output) :- min(L1t, L2t, Output), !.
min_list(_, [], false).
min_list([], _, true).
關於列表語法所有你需要知道的是,名單表示爲[Head|Tail]
,其中Head
是列表和Tail
含有其餘元素的子列表的第一個元素。
的!
是切割操作避免回溯探索其他解決方案(如果你不使用它在那裏,系統會等待您按下分號,如果你想另外一個答案,然後它會說false
)。
未使用的謂詞變量表示爲下劃線(否則您將收到關於單例變量的警告)。
您忘記了更新'長度=(> =)。' – Kaarel 2010-11-15 10:01:48
@卡雷爾,謝謝,很好的發現;我現在已經做到了一致。 – sharky 2010-11-15 10:13:45
感謝您的解釋。 – 2010-11-16 18:36:01