An inverse of a program is a program that takes the output of the original program and produces its input. A semi-inverse of a program is a program that takes some of the input and some of the output of the original program and produces the remaining
input and output. Inversion is, hence, a special case of semi-inversion.
We propose a method for inverting and semi-inverting programs written as guarded equations. The semi-inversion process is
divided into four phases: Translation of equations into a relational form, refining operators, determining evaluation order
for each equation of the semi-inverted functions and translation of semi-inverted functions back to the original syntax. In
cases where the method fails to semi-invert a program, it can suggest which additional parts of the programs input or output
are needed to make it work.