1

List が[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).

ただし、ソートされていないリストでは機能しません。

4

1 に答える 1

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].

うまくいくようです。

于 2013-05-08T13:47:47.787 に答える