よく使う述語: リスト編
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
以外の決定性のものも定義されている.