Declaratieve Talen/oplossingenPalindromen

Uit Wina Examenwiki
Versie door Sven.thijssen (overleg | bijdragen) op 7 nov 2017 om 21:46 (Nieuwe pagina aangemaakt met '% Warning: Does not generate all solutions. % % Substitutes elements which occur the least in the list. % The cost is defined as the number of subsitutions, hence...')
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

% Warning: Does not generate all solutions. % % Substitutes elements which occur the least in the list. % The cost is defined as the number of subsitutions, hence % the length of the list minus the times the most common element occurs. % Torben Gernaey & Sven Thijssen allesgelijk(List, Cost, Result) :-

   map_elements(List, UnsortedMap),
   sort(UnsortedMap, SortedLowToHighMap),
   reverse(SortedLowToHighMap, SortedHighToLowMap),
   most_common(SortedHighToLowMap, Times, Element),
   substitute(List, Element, Result),
   length(List, Length),
   Cost is Length - Times.
   

map_elements(List, Map) :-

   map_elements(List, [], Map).

map_elements([], Map, Map). map_elements([Element|List], Map, Result) :-

   \+ member(pair(_, Element), Map),
   append([pair(1, Element)], Map, NewMap),
   map_elements(List, NewMap, Result).

map_elements([Element|List], Map, Result) :-

   member(pair(_, Element), Map),
   update_element(Element, Map, [], NewMap),
   map_elements(List, NewMap, Result).

update_element(_, [], Result, Result). update_element(Element, [pair(Value, Key)|Map], Temp, Result) :-

   Element \= Key,
   update_element(Element, Map, [pair(Value, Key)|Temp], Result).

update_element(Element, [pair(Value, Element)|Map], Temp, Result) :-

   NewValue is Value + 1,
   update_element(Element, Map, [pair(NewValue, Element)|Temp], Result).

most_common([pair(Times,Element)|_], Times, Element). substitute([], _, []). % Not necessary to split, since all elements will be the same. % Other solution: % substitute([_|List], Element, [Element|Result]) :- % substitute(List, Element, Result). substitute([X|List], Element, [Element|Result]) :-

   X \= Element,
   substitute(List, Element, Result).

substitute([Element|List], Element, [Element|Result]) :-

   substitute(List, Element, Result).