% herramientas para el manejo de 'features' en inglés % gabriel@ranchonotorious.org % cargar segments init :- consult('features.pro') , write_nl_list([ 'herramientas para manejo de ''features'' en inglés' , 'predicados:' , ' display_segment(Segment+).' , ' find_segment(Segment+).' , ' find_all_segments(Feature_list+, List-).' , ' compare_segments(Segment_list+, Common_features-).' , ' contrast_segments(Segment_1+, Segment_2+).' , ' segment_superset(Segment_list+, List_superset-).' , ' segments_to_features(Segment_list+, Lists_of_features-).' ]) . % sobre los segmentos compare_segments(Segment_list, Common_features) :- segments_to_features(Segment_list, Lists_of_features) , common_elements_from_list(Lists_of_features, Common_features) . contrast_segments(S1, S2) :- segments_to_features([S1, S2], [F1|[F2_h|[]]]) , diff_elements(F1, F2_h, Diff_1) , diff_elements(F2_h, F1, Diff_2) %, write(S1) , write(S2) , write(':') , write(Diff_1) , nl %, write(S2) , write(S1) , write(':') , write(Diff_2) . segment_superset(Segment_list, List_superset) :- compare_segments(Segment_list, Common_features) , find_all_segments(Common_features, List_superset) . display_segment(Segment) :- segment(Segment, Features) , write_nl_list([Segment|Features]) . find_segment(Feature_list, Segment) :- segment(Segment, Features) , all_are_members(Feature_list, Features) . find_all_segments(Feature_list, List) :- bagof(Segment, find_segment(Feature_list, Segment), List) . segments_to_features(Segment_list, Lists_of_features) :- segments_to_features(Segment_list,[],Lists_of_features) . segments_to_features([],Acumulator, Acumulator). segments_to_features([H|List_of_segments], Acumulator, Lists_of_features) :- segment(H,Features) , segments_to_features(List_of_segments, [Features|Acumulator],Lists_of_features) . % manipulación de listas member(Element, [Element|_]). member(Element, [_|List]) :- member(Element, List) . non_member(Element, List) :- not(member(Element, List)) . all_are_members([], _). all_are_members([Next|List], Set) :- member(Next, Set) , all_are_members(List, Set) . % common_elements /2, common_elements(List_1,List_2,Common) :- common_elements(List_1, List_2, [], Common) . common_elements([],_,[]). common_elements(_,[],[]). common_elements([L1_h|L1_t], L2, Acumulator, Common) :- member(L1_h, L2) , common_elements(L1_t, L2, [L1_h|Acumulator], Common) . common_elements([L1_h|L1_t], L2, Acumulator, Common) :- non_member(L1_h, L2) , common_elements(L1_t, L2, Acumulator, Common) . common_elements([L_i|[]], L2, Acumulator, [L_i|Acumulator]) :- member(L_i, L2) . common_elements([L_i|[]], L2, Acumulator, Acumulator) :- non_member(L_i, L2) . diff_elements(L1, L2, Diff) :- diff_elements(L1, L2, [], Diff) . diff_elements([Item|[]], L2, Acumulator, [Item|Acumulator]) :- non_member(Item, L2) . diff_elements([Item|[]], L2, Acumulator, Acumulator) :- member(Item, L2) . diff_elements([L1_h|L1_t], L2, Acumulator, Diff) :- non_member(L1_h, L2) , diff_elements(L1_t, L2, [L1_h|Acumulator], Diff) . diff_elements([L1_h|L1_t], L2, Acumulator, Diff) :- member(L1_h, L2) , diff_elements(L1_t, L2, Acumulator, Diff) . % common_elements_from_list(List_of_lists, Common). common_elements_from_list([[H|T]], [H|T]). common_elements_from_list([[]], []). common_elements_from_list([[H1|T1],[H2|T2]|Tail],Common) :- common_elements([H1|T1],[H2|T2], Partial) , common_elements_from_list([Partial|Tail], Common) . % output write_nl_list([]). write_nl_list([Item|Remainders]) :- write(Item) , nl , write_nl_list(Remainders) . % vim:filetype=prolog