差分リストの練習 その2

同期同士の勉強会でお題をもらった!

zip

list_heads(Lists, Hs, Rs) :- list_heads_sub(Lists, Hs, Rs), !.
list_heads(_, [], []).
list_heads_sub([[H | R] | Ls], [H | Hs], [R | Rs]) :-
        H \== [], list_heads_sub(Ls, Hs, Rs).
list_heads_sub(_, [], []).

zip(Lists, Result) :- zip_sub(Lists, [Result, []]).
zip_sub(Lists, [Result, Tail]) :-
        Lists \== [],
        list_heads(Lists, Hs, Rs),
        Hs \== [],
        [Result, Appender1] = [[Hs | Appender1], Appender2],
        zip_sub(Rs, [Appender2, Tail]), !.
zip_sub(_, [Tail, Tail]).

実行例

| ?- list_heads([[a,a],[b,a], [c,a]], Hs, Rs), list_heads(Rs, Hs1, Rs1).
list_heads([[a,a],[b,a], [c,a]], Hs, Rs), list_heads(Rs, Hs1, Rs1).

Hs = [a,b,c]
Hs1 = [a,a,a]
Rs = [[a],[a],[a]]
Rs1 = [[],[],[]]

(4 ms) yes
| ?- list_heads([[a],[b], [c]], Hs, Rs), list_heads(Rs, Hs1, Rs1).
list_heads([[a],[b], [c]], Hs, Rs), list_heads(Rs, Hs1, Rs1).

Hs = [a,b,c]
Hs1 = []
Rs = [[],[],[]]
Rs1 = []

yes
| ?- list_heads([[],[b], [c]], Hs, Rs)
list_heads([[],[b], [c]], Hs, Rs).

Hs = []
Rs = []

yes
| ?- zip([[a,a],[b,b], [c,c]], Hs).
zip([[a,a],[b,b], [c,c]], Hs).

Hs = [[a,b,c],[a,b,c]]

yes
| ?- zip([[a,a],[b,b,b], [c,c]], Hs).
zip([[a,a],[b,b,b], [c,c]], Hs).

Hs = [[a,b,c],[a,b,c]]

(4 ms) yes
| ?- zip([[],[], []], Hs).
zip([[],[], []], Hs).

Hs = []

(4 ms) yes
| ?- zip([], Hs).
zip([], Hs).

Hs = []

yes
| ?-
zip 修正

listを見る必要はなかった。

zip(Lists, Result) :- zip_sub(Lists, [Result, []]).
zip_sub(Lists, [Result, Tail]) :-
        list_heads(Lists, Hs, Rs),
        Hs \== [],
        [Result, Appender1] = [[Hs | Appender1], Appender2],
        zip_sub(Rs, [Appender2, Tail]), !.
zip_sub(_, [Tail, Tail]).
list_heads 修正

Hを見る必要もなかった。

list_heads(Lists, Hs, Rs) :- list_heads_sub(Lists, Hs, Rs), !.
list_heads(_, [], []).
list_heads_sub([[H | R] | Ls], [H | Hs], [R | Rs]) :- list_heads_sub(Ls, Hs, Rs).
list_heads_sub(_, [], []).

last

うまく作れない。。。動かないコードをはっとく

/* 動かない。。。 */
my_last([_ | Rest], Result) :- my_last(Rest, Result).
my_last([Result | []], Result).