#### Exercise 5.1: Thick Boundaries

Given: a system array with constant boundaries of size k, that is to be evolved by a given function "evolve", which returns only the core of the new system array;
Compose: a code fragment that evolves the system and puts the boundary rows and columns onto the core system returned by function "evolve".

```let new_core   := evolve(system_array); % returns only the core of the new system
top_indx   := array_liml(system_array);
btm_indx   := array_limh(system_array);

new_top    := for i in top_indx, top_indx+k-1
top_bound_row := system_array[i]
returns array of top_bound_row
end for;
new_btm    := for i in btm_indx-k+1, btm_indx
btm_bound_row := system_array[i]
returns array of btm_bound_row
end for;

left_indx  := array_liml(system_array[1]); % assume all rows have same range
right_indx := array_limh(system_array[1]);

long_core  := for row in new_core at i
left_bound_elts  := for j in left_indx, left_indx+k-1
left_elts  := system_array[i,j]
returns array of left_elts
end for;
right_bound_elts := for j in right_indx-k+1, right_indx
right_elts := system_array[i,j]
returns array of right_elts
end for;

returns array of left_bound_elts || row || right_bound_elts
end for;
long_tall  := new_top || long_core || new_btm

in  long_tall % The newly evolved system, complete with boundaries.
end let```
Note: If you came close to an answer equivalent to this one, you're to be congratulated. This is a nontrivial piece of Sisal coding, and indicates a good understanding of all that's gone before. If you didn't, don't be discouraged. This sort of coding requires a change of mind-set from that needed for programming in other languages. We believe that, once you make the shift to thinking functionally, the Sisal language will make you a faster and more productive programmer. If you require further proof of this, try writing the above code fragment in your favorite imperative language, and see if you think it's shorter, neater, or easier to read.