Mercury 勉強メモ

関数論理型言語 Mercury を勉強するブログです.

よく使う述語: リスト編

Mercury の標準ライブラリから, リスとに関連するよく使いそうな述語をピックアップしました.

基本操作

list.length

:- func list.length(list(T)) = int.
:- pred list.length(list(_T), int).
:- mode list.length(in, out) is det.

リストの長さ.

list.append

:- func list.append(list(T), list(T)) = list(T).
:- pred list.append(list(T), list(T), list(T)).
:- mode list.append(di, di, uo) is det.
:- mode list.append(in, in, out) is det.
:- mode list.append(in, in, in) is semidet.
:- mode list.append(in, out, in) is semidet.
:- mode list.append(out, out, in) is multi.

リストの連結.

(list) ++

:- func list(T) ++ list(T) = list(T).

リストの連結.

list.index0

:- func list.det_index0(list(T), int) = T.
:- pred list.index0(list(T)::in, int::in, T::out) is semidet.

リストのn番目の要素(最初の要素は0番目).

list.index1

:- func list.det_index1(list(T), int) = T.
:- pred list.index1(list(T)::in, int::in, T::out) is semidet.

リストのn番目の要素(最初の要素は1番目).

list.member

:- pred list.member(T, list(T)).
:- mode list.member(in, in) is semidet.
:- mode list.member(out, in) is nondet.

リストに要素が含まれているかどうか.

list.delete

:- pred list.delete(list(T), T, list(T)).
:- mode list.delete(in, in, in) is semidet.
:- mode list.delete(in, in, out) is nondet.
:- mode list.delete(in, out, out) is nondet.
:- mode list.delete(out, in, in) is multi.

リストから指定した値の要素を1つ削除する.

list.delete_all

:- func list.delete_all(list(T), T) = list(T).
:- pred list.delete_all(list(T), T, list(T)).
:- mode list.delete_all(di, in, uo) is det.
:- mode list.delete_all(in, in, out) is det.

リストから指定した値の要素を全部削除する.

list.reverse

:- pred list.reverse(list(T), list(T)).
:- mode list.reverse(in, out) is det.
:- mode list.reverse(out, in) is det.

リストを反転する.

list.sublist

:- pred list.sublist(list(T)::in, list(T)::in) is semidet.

リストの部分リストを返す.

list.perm

:- pred list.perm(list(T)::in, list(T)::out) is multi.

リストの要素を並べ替えたリストを返す.

list.sort

:- func list.sort_and_remove_dups(list(T)) = list(T).
:- pred list.sort_and_remove_dups(list(T)::in, list(T)::out) is det.

リストをソートする.

list.take

:- pred list.take(int::in, list(T)::in, list(T)::out) is semidet.

リストの先頭n個を取り出す.

list.drop

:- pred list.drop(int::in, list(T)::in, list(T)::out) is semidet.

リストの先頭n個を取り除いたリストを返す.

list.alltrue

:- pred list.all_true(pred(X)::in(pred(in) is semidet), list(X)::in) is semidet.

リストの要素がすべて述語を満たすかを確かめる.

list.allfalse

:- pred list.all_false(pred(X)::in(pred(in) is semidet), list(X)::in) is semidet.

リストの要素がすべて述語を満たさないかを確かめる.

list.filter

:- func list.filter(pred(X)::in(pred(in) is semidet), list(X)::in) = (list(X)::out) is det.
:- pred list.filter(pred(X)::in(pred(in) is semidet), list(X)::in, list(X)::out) is det.

述語を満たすリストだけをあつめる.

list.takewhile

:- pred list.takewhile(pred(T)::in(pred(in) is semidet), list(T)::in, list(T)::out, list(T)::out) is det.

リストを述語を満たす間とりつづけ,残りと共に返す.

list.map

:- pred list.map(pred(X, Y), list(X), list(Y)).
:- mode list.map(pred(in, out) is det, in, out) is det.

リストのすべての要素に述語を通したリストを返す. is det 以外の決定性のものも定義されている.

list.map2

:- pred list.map2(pred(A, B, C), list(A), list(B), list(C)).
:- mode list.map2(pred(in, out, out) is det, in, out, out) is det.

リストのすべての要素に述語を通したリストを返す. is det 以外の決定性のものも定義されている. map3からmap8まで定義されている.

list.foldl

:- pred list.foldl(pred(L, A, A), list(L), A, A).
:- mode list.foldl(pred(in, in, out) is det, in, in, out) is det.

左から畳み込む.リストを述語を使って値にまとめる. is det 以外の決定性のものも定義されている.

list.foldr

:- pred list.foldr(pred(L, A, A), list(L), A, A).
:- mode list.foldr(pred(in, in, out) is det, in, in, out) is det.

右から畳み込む.リストを述語を使って値にまとめる. is det 以外の決定性のものも定義されている.