/usr/bin/looper is in ladr4-apps 0.0.200911a-2.1+b2.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | #!/usr/bin/python
# This script takes a (Prover9|Mace4) input file (the head), and
# a stream of candidates. For each candidate, it appends the
# candidate to the head, and then runs (Prover9|Mace4).
# An agrument to the script says whether the candidate is
# appended as an assumption or as a goal.
#
# Actually, a "candidate" is a line from the input, so a candidate
# can consist of more than one formula.
#
# Standard output gets any (proofs|models) that are found, and
# a few statistics about each search.
#
# Before using this script for Mace4, consider using the script "attack",
# which does something similar, but it first checks each candidate against
# previously found models, before calling Mace4.
help_string = 'need 3 args: (prover9|mace4) (assumptions|goals) head < candidates\n'
import os
import sys
import re
import time
import socket
from subprocess import *
####################################
def runjob4(command_and_args, stdin_string=None):
if debug:
print "Starting job:", command_and_args
# Must have stdin arg; otherwise, it uses this process's stdin.
p1 = Popen(command_and_args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
(out, err) = p1.communicate(stdin_string)
exit_code = p1.wait()
pid = p1.pid
if debug:
sys.stdout.writelines(out)
sys.stdout.writelines(err)
print "pid=%d, exit_code=%d" % (pid,exit_code)
return (pid, exit_code, out, err)
def echo_file(fname):
f = open(fname, 'r')
sys.stdout.writelines(f.readlines())
sys.stdout.flush()
f.close()
def goodlines(lines):
keep = []
collect = False
for line in lines:
if re.search('= (PROOF|MODEL) =', line):
collect = True
if collect or re.search('Fatal|Given|Selections|CPU|Process.*exit', line):
keep.append(line)
if re.search('= end of (proof|model) =', line):
collect = False
return keep
def get_cpu(lines):
cpu = '???'
for line in lines:
if re.match('User_CPU', line):
cpu = re.split('=|,', line)[1]
return cpu
####################################
if len(sys.argv) != 4:
sys.stderr.write(help_string)
sys.exit(1)
# assume prover9 and mace4 are in the user's path
program = sys.argv[1]
list = sys.argv[2]
head_fname = sys.argv[3]
scriptname = 'looper'
if (program != 'prover9' and program != 'mace4') or (list != 'assumptions' and list != 'goals'):
sys.stderr.write(help_string)
sys.exit(1)
if not os.path.isfile(head_fname):
sys.stderr.write('head file %s not found\n' % head)
sys.exit(1)
cand_fname = 'cand_%d.in' % os.getpid()
debug = False
mace4_model_exits = [0]
mace4_error_exits = [1, 101, 102]
prover9_proof_exits = [0]
prover9_error_exits = [1, 101, 102]
date = time.strftime('%A, %b %d, %I:%M %p %Y', time.localtime())
host = socket.gethostname()
print "Started %s %s on %s." % (scriptname,date,host)
print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HEAD FILE %%%%%%%%%"
echo_file(head_fname)
print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end of head file %%%%%"
if (program == 'prover9'):
command_list = [program, '-f', head_fname, cand_fname]
else:
command_list = [program, '-c', '-f', head_fname, cand_fname]
n = 0
successes = 0
failures = 0
####################################
for cand in sys.stdin:
# get rid of newline and any comment
cand = re.sub('\n', '', cand)
cand = re.sub(' *%.*', '', cand)
if cand == '':
continue
n += 1
sys.stdout.write('----------------------------------------------------------------------\n')
sys.stdout.write('%s %% Problem %d\n\n' % (cand, n))
sys.stdout.flush()
cand_file = open(cand_fname, 'w')
cand_file.write('formulas(%s).\n' % list)
cand_file.write(cand + '\n')
cand_file.write('end_of_list.\n')
cand_file.write('clear(print_given).\n')
cand_file.close()
(pid, rc, out, err) = runjob4(command_list)
if (program == 'mace4' and rc in mace4_error_exits) or \
(program == 'prover9' and rc in prover9_error_exits):
sys.stderr.write('program error, rc=%d\n' % rc)
sys.stdout.write(err)
sys.stdout.write(out)
failures += 1
else:
outlines = out.splitlines(1)
keeplines = goodlines(outlines)
for line in keeplines:
sys.stdout.write(line)
cpu = get_cpu(keeplines)
if (program == 'prover9' and rc in prover9_proof_exits):
message = 'Proved'
successes += 1
elif (program == 'mace4' and rc in mace4_model_exits):
message = 'Disproved'
successes += 1
else:
message = 'Failed'
failures += 1
sys.stdout.write('\n%s %% %s %s seconds PROBLEM %d\n' % (cand, message, cpu, n))
sys.stdout.flush()
os.remove(cand_fname)
date = time.strftime('%A, %b %d, %I:%M %p %Y', time.localtime())
print "\nFinished %s, processed %d, successes %d, failures %d.\n" % (date,n,successes,failures)
sys.exit(0)
|