From definitional interpreter to symbolic executor