[m-rev.] diff: list.m cleanup

Zoltan Somogyi zs at cs.mu.OZ.AU
Mon Aug 30 15:07:34 AEST 2004


library/list.m:
	Fix some old Prologisms to make the code easier to read, and in
	one case to use accumulators.

Zoltan.

cvs server: Diffing .
Index: list.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/list.m,v
retrieving revision 1.121
diff -u -b -r1.121 list.m
--- list.m	26 Jul 2004 03:19:27 -0000	1.121
+++ list.m	30 Aug 2004 05:06:31 -0000
@@ -805,11 +805,16 @@
 %-----------------------------------------------------------------------------%
 
 list__nth_member_search([X | Xs], Y, N) :-
+	list__nth_member_search_2([X | Xs], Y, 1, N).
+
+:- pred list__nth_member_search_2(list(T)::in, T::in, int::in, int::out)
+	is semidet.
+
+list__nth_member_search_2([X | Xs], Y, P, N) :-
 	( X = Y ->
-		N = 1
+		N = P
 	;
-		list__nth_member_search(Xs, Y, N0),
-		N = N0 + 1
+		list__nth_member_search_2(Xs, Y, P + 1, N)
 	).
 
 %-----------------------------------------------------------------------------%
@@ -818,8 +823,7 @@
 	( N = 0 ->
 		Elem = X
 	;
-		N1 = N - 1,
-		list__index0(Xs, N1, Elem)
+		list__index0(Xs, N - 1, Elem)
 	).
 
 list__index0_det(List, N, Elem) :-
@@ -830,12 +834,10 @@
 	).
 
 list__index1(List, N, Elem) :-
-	N1 = N - 1,
-	list__index0(List, N1, Elem).
+	list__index0(List, N - 1, Elem).
 
 list__index1_det(List, N, Elem) :-
-	N1 = N - 1,
-	list__index0_det(List, N1, Elem).
+	list__index0_det(List, N - 1, Elem).
 
 %-----------------------------------------------------------------------------%
 
@@ -865,8 +867,8 @@
 	( X = Y ->
 		Zs = Xs
 	;
-		Zs = [X | Zs1],
-		list__delete_first(Xs, Y, Zs1)
+		list__delete_first(Xs, Y, Zs1),
+		Zs = [X | Zs1]
 	).
 
 list__delete_all([], _, []).
@@ -874,8 +876,8 @@
 	( X = Y ->
 		list__delete_all(Xs, Y, Zs)
 	;
-		Zs = [X | Zs1],
-		list__delete_all(Xs, Y, Zs1)
+		list__delete_all(Xs, Y, Zs1),
+		Zs = [X | Zs1]
 	).
 
 list__delete_elems(Xs, [], Xs).
@@ -893,18 +895,18 @@
 	( X = Y ->
 		List = [Z | Xs]
 	;
-		List = [X | L1],
-		list__replace_first(Xs, Y, Z, L1)
+		list__replace_first(Xs, Y, Z, L1),
+		List = [X | L1]
 	).
 
 list__replace_all([], _, _, []).
 list__replace_all([X | Xs], Y, Z, L) :-
 	( X = Y ->
-		L = [Z | L0],
-		list__replace_all(Xs, Y, Z, L0)
+		list__replace_all(Xs, Y, Z, L0),
+		L = [Z | L0]
 	;
-		L = [X | L0],
-		list__replace_all(Xs, Y, Z, L0)
+		list__replace_all(Xs, Y, Z, L0),
+		L = [X | L0]
 	).
 
 list__replace_nth(Xs, P, R, L) :-
@@ -933,8 +935,7 @@
 	( P = 1 ->
 		L = [R | Xs]
 	;
-		P1 = P - 1,
-		list__replace_nth(Xs, P1, R, L0),
+		list__replace_nth(Xs, P - 1, R, L0),
 		L = [X | L0]
 	).
 
@@ -950,47 +951,36 @@
 
 %-----------------------------------------------------------------------------%
 
-list__merge(A, B, C) :-
-	( A = [X | Xs] ->
-		( B = [Y | Ys] ->
-			C = [Z | Zs],
-			( compare(>, X, Y) ->
-				Z = Y,
-				list__merge(A, Ys, Zs)
-			;
-				% If compare((=), X, Y), take X first.
-				Z = X,
-				list__merge(Xs, B, Zs)
-			)
-		;
-			C = A
-		)
-	;
-		C = B
-	).
-
-list__merge_and_remove_dups(A, B, C) :-
-	( A = [X | Xs] ->
-		( B = [Y | Ys] ->
-			compare(Res, X, Y),
+list__merge([], [], []).
+list__merge([A | As], [], [A | As]).
+list__merge([], [B | Bs], [B | Bs]).
+list__merge([A | As], [B | Bs], [C | Cs]) :-
+	( compare(>, A, B) ->
+		C = B,
+		list__merge([A | As], Bs, Cs)
+	;
+		% If compare((=), A, B), take A first.
+		C = A,
+		list__merge(As, [B | Bs], Cs)
+	).
+
+list__merge_and_remove_dups([], [], []).
+list__merge_and_remove_dups([A | As], [], [A | As]).
+list__merge_and_remove_dups([], [B | Bs], [B | Bs]).
+list__merge_and_remove_dups([A | As], [B | Bs], [C | Cs]) :-
+	compare(Res, A, B),
 			(
 				Res = (<),
-				C = [X | Zs],
-				list__merge_and_remove_dups(Xs, B, Zs)
-			;
-				Res = (>),
-				C = [Y | Zs],
-				list__merge_and_remove_dups(A, Ys, Zs)
+		C = A,
+		list__merge_and_remove_dups(As, [B | Bs], Cs)
 			;
 				Res = (=),
-				C = [X | Zs],
-				list__merge_and_remove_dups(Xs, Ys, Zs)
-			)
+		C = A,
+		list__merge_and_remove_dups(As, Bs, Cs)
 		;
-			C = A
-		)
-	;
-		C = B
+		Res = (>),
+		C = B,
+		list__merge_and_remove_dups([A | As], Bs, Cs)
 	).
 
 %-----------------------------------------------------------------------------%
@@ -1069,9 +1059,7 @@
 
 list__remove_dups_2([], _SoFar, []).
 list__remove_dups_2([X | Xs], SoFar0, Zs) :-
-	(
-		bintree_set__member(X, SoFar0)
-	->
+	( bintree_set__member(X, SoFar0) ->
 		list__remove_dups_2(Xs, SoFar0, Zs)
 	;
 		bintree_set__insert(SoFar0, X, SoFar),
@@ -1088,14 +1076,13 @@
 :- pred list__remove_adjacent_dups_2(list(T)::in, T::in, list(T)::out) is det.
 :- pragma type_spec(list__remove_adjacent_dups_2/3, T = var(_)).
 
-
 list__remove_adjacent_dups_2([], X, [X]).
 list__remove_adjacent_dups_2([X1 | Xs], X0, L) :-
 	( X0 = X1 ->
 		list__remove_adjacent_dups_2(Xs, X0, L)
 	;
-		L = [X0 | L0],
-		list__remove_adjacent_dups_2(Xs, X1, L0)
+		list__remove_adjacent_dups_2(Xs, X1, L0),
+		L = [X0 | L0]
 	).
 
 %-----------------------------------------------------------------------------%
@@ -1119,18 +1106,16 @@
 		End = List
 	;
 		N > 0,
-		N1 = N - 1,
 		List = [Head | List1],
 		Start = [Head | Start1],
-		list__split_list(N1, List1, Start1, End)
+		list__split_list(N - 1, List1, Start1, End)
 	).
 
 list__take(N, As, Bs) :-
 	( N > 0 ->
-		N1 = N - 1,
 		As = [A | As1],
-		Bs = [A | Bs1],
-		list__take(N1, As1, Bs1)
+		list__take(N - 1, As1, Bs1),
+		Bs = [A | Bs1]
 	;
 		Bs = []
 	).
@@ -1144,9 +1129,8 @@
 
 list__drop(N, As, Bs) :-
 	( N > 0 ->
-		N1 = N - 1,
 		As = [_ | Cs],
-		list__drop(N1, Cs, Bs)
+		list__drop(N - 1, Cs, Bs)
 	;
 		As = Bs
 	).
@@ -1155,9 +1139,8 @@
 
 list__duplicate(N, X, L) :-
 	( N > 0 ->
-		N1 = N - 1,
-		L = [X | L1],
-		list__duplicate(N1, X, L1)
+		list__duplicate(N - 1, X, L1),
+		L = [X | L1]
 	;
 		L = []
 	).
@@ -1179,12 +1162,11 @@
 	).
 list__chunk_2([X | Xs], ChunkSize, List0, N, Lists) :-
 	( N > 1 ->
-		N1 = N - 1,
-		list__chunk_2(Xs, ChunkSize, [X | List0], N1, Lists)
+		list__chunk_2(Xs, ChunkSize, [X | List0], N - 1, Lists)
 	;
 		list__reverse([X | List0], List),
-		Lists = [List | Lists1],
-		list__chunk_2(Xs, ChunkSize, [], ChunkSize, Lists1)
+		list__chunk_2(Xs, ChunkSize, [], ChunkSize, Lists1),
+		Lists = [List | Lists1]
 	).
 
 %-----------------------------------------------------------------------------%
--------------------------------------------------------------------------
mercury-reviews mailing list
post:  mercury-reviews at cs.mu.oz.au
administrative address: owner-mercury-reviews at cs.mu.oz.au
unsubscribe: Address: mercury-reviews-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-reviews-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the reviews mailing list