userdict (output file written) false put /output_writer_writetofile { userdict (output file written) get false eq { userdict (output file) get (w+) file closefile userdict (open file) userdict (output file) get (a+) file put output_writer_writecomments output_writer_createoutput } { userdict (multiple output to file) get true eq{ output_writer_createoutput } if } ifelse } def /output_writer_finishfile { userdict (open file) get closefile } def /output_writer_cleanup { userdict (output file written) false put } def /output_writer_writecomments { userdict (comments) get userdict (open file) get exch writestring } def /output_writer_createoutput { 1 { %loop over clauses write_clause write_eval newline dup userdict (count clause) get eq { pop exit } if 1 add } loop newline userdict (open file) get flush pop userdict (output file written) true put } def /write_clause { %create key dup (clause) exch 10 string cvs concat %get clause userdict exch get (\( ) exch concat ( \)) concat (\t= ) concat %1 ( (1 2 3) =) userdict (open file) get exch %1 file ( (1 2 3) =) writestring } def /write_eval { %create key dup (clause) exch 10 string cvs concat mark exch %(stop) (1 2 -3) %get clause userdict exch get %push to stack cvx exec %(stop) 1 2 -3 userdict (super eval help) false put ( ) exch %(stop) 1 2 ( ) -3 { dup 0 le { dup abs userdict exch get not }{ dup userdict exch get } ifelse true eq { userdict (super eval help) true put } if dup 0 le { (-) }{ ( ) } ifelse exch %(stop) 1 2 ( ) (-) -3 abs userdict exch get true eq {(t)}{(f)} ifelse %(stop) 1 2 ( ) (-) (t) concat exch concat %(stop) 1 2 (-t ) exch %(stop) 1 ( -t) 2 dup mark eq {pop exit}{ exch ( | ) exch concat exch} ifelse } loop userdict (open file) get exch writestring userdict (open file) get (\t=\t) userdict (super eval help) get true eq {(t)}{(f)} ifelse concat writestring } def /newline { userdict (open file) get (\n) writestring } def