Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Splitting a list of integers into a list of positive integers and a list of negative integers

I've been trying to create a predicate in Prolog which splits a list of integers into a list of positive integers and into a list of negative integers.

Sample query with expected result:

?- split([1,-2,3,4,-8],X,Y).
X = [1,3,4],
Y = [-2,-8].

This is the code I got so far:

split([], [], []).
split([Head|Tail], List1, List2) :- split(Tail, [Head|List1], List2), Head>=0.
split([Head|Tail], List1, List2) :- split(Tail, List1, [Head|List2]), Head<0.

I can't seem to figure out what I'm doing wrong.

like image 206
Martin Avatar asked Mar 03 '12 14:03

Martin


1 Answers

The recursive part is not quite correct.

split([], [], []).
split([Head|Tail], [Head|List1], List2) :- Head>=0, split(Tail, List1, List2).
split([Head|Tail], List1, [Head|List2]) :- Head<0, split(Tail, List1, List2).

The Head should be added to the positive list if Head >= 0 and to the negative list when Head < 0.

Moreover, checking the sign of Head at the beginning is better, because it will prevent unnecessary recursive calls.

like image 177
Sufian Latif Avatar answered Sep 28 '22 06:09

Sufian Latif