Program schemas are known to be useful in different applications such as program synthesis, transformation, analysis, debugging,
teaching . . . This paper tackles two complementary aspects of program schemas. We first propose a language for the description
of program schemas. It is based on a subset of second-order logic, enhanced with constraints and specific features of program
schemas. One of the basic operations on schemas is the semi-unification of a schema with a program. We then express the semi-unification
process over schemas as rewriting and reduction rules, using CLP techniques, where constraints are used to guide the semi-unification
process.