2013-05-07 71 views
1

假設我有一個列表[2,1,4,5],我想要一個謂詞返回3作爲缺少的元素。在列表中找到一個缺失的號碼

missing([], []). 
missing([H|T], R) :- missing([H|T], H, R). 
missing([], _I, []). 
missing([H|T], I, [I|R]) :- 
    H =\= I, 
    !, 
    NextI is I + 1, 
    missing([H|T], NextI, R). 
missing([_|T], I, R) :- 
    NextI is I + 1, 
    missing(T, NextI, R). 

但它不適用於未排序的列表。

+2

祝賀達到15個代表! :)你現在有權力爲你認爲合適的答案投票,並接受你認爲爲你的問題提供解決方案的答案。 – 2013-05-09 10:59:14

回答

3

如果您的實現在未排序列表上不起作用,最簡單的解決方法是在執行算法之前對輸入列表進行排序。您可以通過將sort/2謂詞添加到當前的實現中來完成此操作。

missing([], []). 
missing(Raw, R):- 
    sort(Raw, [H|T]), 
    missing([H|T], H, R). 
missing([], _I, []). 
missing([H|T], I, [I|R]):- 
    H =\= I, 
    !, 
    NextI is I + 1, 
    missing([H|T], NextI, R). 
missing([_|T], I, R):- 
    NextI is I + 1, 
    missing(T, NextI, R). 

測試:

?- missing([1,2,6], M). 
M = [3, 4, 5]. 

?- missing([1,2,6,-1], M). 
M = [0, 3, 4, 5]. 

?- missing([-1, 5], M). 
M = [0, 1, 2, 3, 4]. 

?- missing([-1, 5, -3], M). 
M = [-2, 0, 1, 2, 3, 4]. 

?- missing([5, -3], M). 
M = [-2, -1, 0, 1, 2, 3, 4]. 

似乎工作。

+0

@honey如果你覺得這個答案對於這個問題是足夠的,你應該接受它:http://stackoverflow.com/faq#howtoask這有助於整個社區:它顯示你的查詢已經完成,它允許人們搜索類似問題有一個可接受的答案,它也表明你關心這個社區是如何工作的。 – joneshf 2013-05-08 16:24:22