%% select([[a,b,c],[d,e,f]],a,b,Result). %% Result = [[a,b],[d,e]] select(Table,Attribute,Value,Result) :- delete(Table,Column,Rest), member(Attribute,Column), get_values(Table,[],First_row), select1(Column,Rest,First_row,Value,Result). select1([Value|_Items],Table,First_row,Value,Result1) :- get_values(Table,[Value],Result2), zip(First_row,Result2,[],Result1), !. select1([_Item|Items],Table,Value,Rows1,Result1) :- delete_first_row(Table,[],Rows2), select1(Items,Rows2,Value,Rows1,Result1). get_values([],Result,Result). get_values([Column|Columns],Result1,Result2) :- Column=[Value|_Rest], append(Result1,[Value],Result3), get_values(Columns,Result3,Result2). zip([],[],List,List). zip([Item1|Items1],[Item2|Items2],List1,List2) :- append(List1,[[Item1,Item2]],List3), zip(Items1,Items2,List3,List2). delete_first_row([],Result,Result). delete_first_row([Column|Columns],Result1,Result2) :- Column=[_Value|Rest], append(Result1,[Rest],Result3), delete_first_row(Columns,Result3,Result2).