From 9c88f730d5e8e99bf0ceea3ed8fbf5add2df4baf Mon Sep 17 00:00:00 2001 From: David Baer Date: Sat, 22 Apr 2017 15:35:18 -0400 Subject: [PATCH] Initial check in. --- .gitignore | 52 ++ COPYING | 33 ++ INSTALL | 1 + Makefile | 823 +++++++++++++++++++++++++++ Makefile.am | 2 + README | 275 +++++++++ TODO | 29 + config.h | 71 +++ config.h.in | 70 +++ config.h.in~ | 64 +++ config.log | 572 +++++++++++++++++++ config.status | 1197 ++++++++++++++++++++++++++++++++++++++++ configure.ac | 30 + log.txt | 5 + src/Axiom.cc | 113 ++++ src/Axiom.h | 51 ++ src/FormulaRegistry.cc | 31 ++ src/FormulaRegistry.h | 26 + src/Makefile | 582 +++++++++++++++++++ src/Makefile.am | 4 + src/Markable.h | 26 + src/Options.cc | 112 ++++ src/Options.h | 38 ++ src/ParamSource.cc | 11 + src/ParamSource.h | 36 ++ src/Proof.cc | 602 ++++++++++++++++++++ src/Proof.h | 67 +++ src/Rule.cc | 24 + src/Rule.h | 120 ++++ src/RuleSource.cc | 597 ++++++++++++++++++++ src/RuleSource.h | 46 ++ src/Vector.h | 103 ++++ src/copysplit.cc | 33 ++ src/copysplit.h | 13 + src/formula.cc | 237 ++++++++ src/formula.h | 320 +++++++++++ src/lex.cc | 165 ++++++ src/lex.h | 36 ++ src/lionheart | Bin 0 -> 745290 bytes src/main.cc | 89 +++ src/parser.cc | 263 +++++++++ src/parser.h | 20 + src/predtest.cc | 50 ++ 43 files changed, 7039 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 120000 INSTALL create mode 100644 Makefile create mode 100644 Makefile.am create mode 100644 README create mode 100644 TODO create mode 100644 config.h create mode 100644 config.h.in create mode 100644 config.h.in~ create mode 100644 config.log create mode 100755 config.status create mode 100644 configure.ac create mode 100644 log.txt create mode 100644 src/Axiom.cc create mode 100644 src/Axiom.h create mode 100644 src/FormulaRegistry.cc create mode 100644 src/FormulaRegistry.h create mode 100644 src/Makefile create mode 100644 src/Makefile.am create mode 100644 src/Markable.h create mode 100644 src/Options.cc create mode 100644 src/Options.h create mode 100644 src/ParamSource.cc create mode 100644 src/ParamSource.h create mode 100644 src/Proof.cc create mode 100644 src/Proof.h create mode 100644 src/Rule.cc create mode 100644 src/Rule.h create mode 100644 src/RuleSource.cc create mode 100644 src/RuleSource.h create mode 100644 src/Vector.h create mode 100644 src/copysplit.cc create mode 100644 src/copysplit.h create mode 100644 src/formula.cc create mode 100644 src/formula.h create mode 100644 src/lex.cc create mode 100644 src/lex.h create mode 100755 src/lionheart create mode 100644 src/main.cc create mode 100644 src/parser.cc create mode 100644 src/parser.h create mode 100644 src/predtest.cc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2891f44 --- /dev/null +++ b/.gitignore @@ -0,0 +1,52 @@ +#### joe made this: http://goel.io/joe + +#####=== Autotools ===##### + +# http://www.gnu.org/software/automake + +Makefile.in + +# http://www.gnu.org/software/autoconf + +/autom4te.cache +/aclocal.m4 +/compile +/configure +/depcomp +/install-sh +/missing +/stamp-h1 + +#####=== C++ ===##### + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +/scratch +/src/.deps diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..3c1b715 --- /dev/null +++ b/COPYING @@ -0,0 +1,33 @@ +Lionheart +Copyright © 2000 David A. Baer +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the organization. + +4. Neither the name of the organization nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY David A. Baer ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL David A. Baer BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/INSTALL b/INSTALL new file mode 120000 index 0000000..601bc09 --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +/usr/local/share/automake-1.15/INSTALL \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..af57a91 --- /dev/null +++ b/Makefile @@ -0,0 +1,823 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/lionheart +pkgincludedir = $(includedir)/lionheart +pkglibdir = $(libdir)/lionheart +pkglibexecdir = $(libexecdir)/lionheart +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(dist_doc_DATA) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ + ctags-recursive dvi-recursive html-recursive info-recursive \ + install-data-recursive install-dvi-recursive \ + install-exec-recursive install-html-recursive \ + install-info-recursive install-pdf-recursive \ + install-ps-recursive install-recursive installcheck-recursive \ + installdirs-recursive pdf-recursive ps-recursive \ + tags-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(docdir)" +DATA = $(dist_doc_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +am__recursive_targets = \ + $(RECURSIVE_TARGETS) \ + $(RECURSIVE_CLEAN_TARGETS) \ + $(am__extra_recursive_targets) +AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ + cscope distdir dist dist-all distcheck +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +DIST_SUBDIRS = $(SUBDIRS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in COPYING \ + INSTALL README compile depcomp install-sh missing +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} /home/david/devel/cpp/lionheart000916/missing aclocal-1.15 +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AUTOCONF = ${SHELL} /home/david/devel/cpp/lionheart000916/missing autoconf +AUTOHEADER = ${SHELL} /home/david/devel/cpp/lionheart000916/missing autoheader +AUTOMAKE = ${SHELL} /home/david/devel/cpp/lionheart000916/missing automake-1.15 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +GREP = /usr/bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LDFLAGS = +LIBOBJS = +LIBS = +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/david/devel/cpp/lionheart000916/missing makeinfo +MKDIR_P = /usr/local/bin/gmkdir -p +OBJEXT = o +PACKAGE = lionheart +PACKAGE_BUGREPORT = +PACKAGE_NAME = lionheart +PACKAGE_STRING = lionheart 20000916 +PACKAGE_TARNAME = lionheart +PACKAGE_URL = +PACKAGE_VERSION = 20000916 +PATH_SEPARATOR = : +SET_MAKE = +SHELL = /bin/sh +STRIP = +VERSION = 20000916 +abs_builddir = /home/david/devel/cpp/lionheart000916 +abs_srcdir = /home/david/devel/cpp/lionheart000916 +abs_top_builddir = /home/david/devel/cpp/lionheart000916 +abs_top_srcdir = /home/david/devel/cpp/lionheart000916 +ac_ct_CC = gcc +ac_ct_CXX = g++ +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build_alias = +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host_alias = +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/david/devel/cpp/lionheart000916/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = +top_builddir = . +top_srcdir = . +SUBDIRS = src +dist_doc_DATA = README +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +install-dist_docDATA: $(dist_doc_DATA) + @$(NORMAL_INSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ + done + +uninstall-dist_docDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_doc_DATA)'; test -n "$(docdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run 'make' without going through this Makefile. +# To change the values of 'make' variables: instead of editing Makefiles, +# (1) if the variable is set in 'config.status', edit 'config.status' +# (which will cause the Makefiles to be regenerated when you run 'make'); +# (2) otherwise, pass the desired values on the 'make' command line. +$(am__recursive_targets): + @fail=; \ + if $(am__make_keepgoing); then \ + failcom='fail=yes'; \ + else \ + failcom='exit 1'; \ + fi; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-recursive +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-recursive + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-recursive + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(DATA) config.h +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(docdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-dist_docDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-dist_docDATA + +.MAKE: $(am__recursive_targets) all install-am install-strip + +.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ + am--refresh check check-am clean clean-cscope clean-generic \ + cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dist_docDATA install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + installdirs-am maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ + tags-am uninstall uninstall-am uninstall-dist_docDATA + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..38bdf12 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,2 @@ +SUBDIRS = src +dist_doc_DATA = README diff --git a/README b/README new file mode 100644 index 0000000..f160f90 --- /dev/null +++ b/README @@ -0,0 +1,275 @@ + +Lionheart + +A Refinement Logic Theorem Prover for Propositional Logic + + +In this paper, I propose a simple heuristic algorithm for deciding +logical propositions. The correctness and completeness of the system +are discussed. + +II. Formula Representation + +I use Smullyan's definition of propositional formulas as the basis of +the data structure. Smullyan defines propositional formulas as +follows: + +A. Every propositional variable is a formula +B. If X is a formula so is ~X. +C. If X, Y are formulas, then for each of the binary connectives b, +the expression (X b Y) is a formula. + +The conditions A, B, and C correspond roughly to the classes Var, Not, +and BinOp, three subclasses of PropFormula in Lionheart's C++ +representation. In addition, I introduce the ConstFormula type, +corresponding to the following rule: + +D. true is a formula and false is a formula. + +In the prover's structure, however, this additional type, and then +only F, serves as a placeholder on the right-hand side of the +turnstile and is not manipulated at all. Thus the additional +condition does not affect the completeness or correctness of the +system. + +Each of the formula classes includes a print method, which displays +the representation of that formula. Formulas of type B and C are +printed recursively. The representation of formulas is as stated in +the rules above. + +The formula classes also support an equals method to determine the +equivalence of two formulas X and Y using the following rules: + +1. The formulas must be of the same type. +2. Any immediate subformulas must be equivalent. + +III. Parsing of Formulas + +The C++ source file parser.cc contains a recursive-descent parser for +the formulas described above. The parser recognizes the following +operators, listed in order of increasing precedence: + +A. ~ : NOT +B. & : AND +C. | : OR +D. ==> : IMPLIES + +The last three are binary operators and are left associative. The +parser does not require parentheses around a subexpression containing +a binary operator--the precedence and associativity rules are used to +decide semantic meaning. Thus the input + +p | q | r & t + +corresponds to the following Smullyan-style formula: + +((p v q) v (r ^ t)) + +The parser ignores any spaces and encodes any contiguous alphabetic +text as a variable. Parentheses are supported and function as in the +Smullyan definition, overriding precedence. + +IV. Decision Procedure + +The automatic prover attempts to achieve a proof of the given formula +using the rules of refinement logic. A refinement logic proof step, +or sequent, has the following form: + +H1, H2, H3, ... , Hn |- G + +where Hi is a formula, G is a formula. If a refinement-logic proof of +the sequent exists, then we say G is true given H1, ... , Hn. + +The refinement logic system is isomorphic and equivalent to the +analytic tableau system presented in Smullyan, and is therefore +correct and complete. A propositional formula X is a tautology if and +only if the sequent + + |- X + +has a refinement-logic proof. The rules of refinement logic are +summarized in the appendix. + +One difficulty with refinement logic is that many possible rules may +be legally applied to a given sequent. For example, one might +repeatedly apply notR and notL, moving one formula from right to left, +without making any progress in the proof. For this reason, the prover +makes use of a set of heuristics to determine when to apply a rule: + +A. If the formula on the right of the turnstile is a variable and is +not equal to any formula on the left side, notR. + +B. If the formula on the right of the turnstile is a variable and is +equal to a formula on the left side, hyp. + +C. If the formula on the right of the turnstile is a binary formula +with &, andR. + +D. If the formula on the right of the turnstile is a binary formula +with ==>, impL. + +E. If the formula on the right of the turnstile is a binary formula +with |, and one of its immediate subformulas is the logical conjugate +of the other, magic. + +F. If the formula on the right of the turnstile is a logical conjugate, +notR. + +Let a formula be called basic if it is either a variable or the +logical conjugate of a binary formula with |. + +G. If the formula on the right of the turnstile is a binary formula +with | and all formulas on the left are basic, then attempt a proof after +applying an orR1. If unsuccessful, attempt a proof after applying an +orR2. + +H. If the formula on the right of the turnstile is a binary formula +with | and there are non-basic formulas on the left, notR. + +I. If there is some non-basic formula on the left, apply one of orL, +andL, impL, notL, in that order of precedence. + +J. If a variable and its logical conjugate are on the left hand side, +apply notL to the conjugate. (Note that this is followed immediately by +rule B). + +K. Give up and fail to find a proof. + +The prover attempts to use A through K in that order, so the earlier +rules take precedence over the later rules. + +Claim: (Correctness) Any formula proved by this system is a tautology. + +Proof: The system is constrained by the rules of refinement logic, +which has been proved correct. + +For the proof of correctness I must introduce a measure of the +progress of the prover. Construct a function height which maps the +propositional formulas to the natural numbers. Define + +height(p) = 0, for all propositional variables p +height(~X) = height(X), for all propositional formulas X +height(X b Y) = height(X) + height(Y) + 1, for all formulas X, Y, and +all binary connectives b. + +Further, construct seqheight, mapping refinement logic sequents to the +natural numbers, such that if S is the sequent + +H1, ... , Hn |- G + +seqheight(S) = sum(i=1..n)height(Hi) + height(G) + +Let us say that sequent S dominates T if T is generated by one of the +subgoals of S. Note that this is not a strict ordering, since S may +have up to two subgoals. + +Lemma: Let the sequent S contain a formula with a binary connective. +Then each subgoal of S contains a sequent T generated by the system +such that seqheight(T) < seqheight(S). + +Proof: + +If the binary formula is on the right-hand side of S: + + If it is an AND formula, apply andR, decreasing the height of the + right side for both subgoals. + + If it is an IMPL formula, apply impR on X==>Y. This decreases the + height of the sequent by one, since Y remains on the right side and + X joins the left side. + + If it is an OR formula, assume there are no binary formulas on the + left side (since this case is handled separately). Then apply + orR1/orR2, decreasing the height of the right side. + + If it is the logical conjugate of a binary formula, apply notR. + The binary formula is then on the left side. (Note that the system + does not generate formulas of the form ~~X, although this is legal + by Smullyan's definition). The system now applies left-hand-side + rules. + +If the binary formula is on the left-hand side of S: + + If it is an AND or OR formula, apply andL or orL. The loss of the + connective decreases seqheight by at least 1. + + If it is an IMPL formula, apply impL. The two subgoals have height + decreased by at least 1 for loss of the connective. + + If it is the logical conjugate of a binary formula, apply notL to + bring a binary formula to the right side. The system now applies + right-hand-side rules. + +Claim: (Completeness) Every tautology is proved by the system. + +Proof: From the lemma above we obtain the result that the system +decreases the height of sequents until there are no more binary +connectives. So the only formulas left are of the form p and ~p, +where p is a propositional variable. Consider the 3 cases: + +1) There is some variable p such that p and ~p are on the left side of + the sequent. In this case, rule A is employed to apply notL to + ~p. This yields case 2: + +2) There is some variable p such that p is on both sides of the + sequent. In this case, the hyp rule is used, so the proof of the + subgoal succeeds. + +3) Neither of the above conditions holds. The pseudo-rule giveup is + used, so the proof of the subgoal fails. + +By the completeness and correctness result of refinement logic, a +sequent is true iff its subgoals are true. + +The only means of losing information from a sequent is by applying +orR1 or orR2, but the above system tries both cases. Therefore, the +Lionheart system is complete. + +V. Testing + +A number of propositional logic tautologies from Smullyan were used to +test the Lionheart prover. A portion of the results are found below: + + |- (((p ==> q) & (q ==> r)) ==> (p ==> r)) by impR +((p ==> q) & (q ==> r)) |- (p ==> r) by impR +((p ==> q) & (q ==> r)), p |- r by notR +((p ==> q) & (q ==> r)), p, ~r |- false by andL +p, ~r, (p ==> q), (q ==> r) |- false by impL + p, ~r, (q ==> r) |- p by hyp + + p, ~r, (q ==> r), q |- false by impL + p, ~r, q |- q by hyp + + p, ~r, q, r |- false by notL + p, q, r |- r by hyp + + + |- ((((p ==> r) & (q ==> r)) & (p | q)) ==> r) by impR +(((p ==> r) & (q ==> r)) & (p | q)) |- r by notR +(((p ==> r) & (q ==> r)) & (p | q)), ~r |- false by andL +~r, ((p ==> r) & (q ==> r)), (p | q) |- false by andL +~r, (p | q), (p ==> r), (q ==> r) |- false by orL + ~r, (p ==> r), (q ==> r), p |- false by impL + ~r, (q ==> r), p |- p by hyp + + ~r, (q ==> r), p, r |- false by impL + ~r, p, r |- q by notR + ~r, p, r, ~q |- false by notL + p, r, ~q |- r by hyp + + ~r, p, r, r |- false by notL + p, r, r |- r by hyp + + ~r, (p ==> r), (q ==> r), q |- false by impL + ~r, (q ==> r), q |- p by notR + ~r, (q ==> r), q, ~p |- false by impL + ~r, q, ~p |- q by hyp + + ~r, q, ~p, r |- false by notL + q, ~p, r |- r by hyp + + ~r, (q ==> r), q, r |- false by impL + ~r, q, r |- q by hyp + + ~r, q, r, r |- false by notL + q, r, r |- r by hyp diff --git a/TODO b/TODO new file mode 100644 index 0000000..306283c --- /dev/null +++ b/TODO @@ -0,0 +1,29 @@ +- Fix memory leak. Proof.cleanup doesn't seem to work... +- Add automated proof support. This can probably be done in a series + of stages: + 1) Create a semi-automated prover that applies rules when it can + and seeks user input when it has to (inherit from UserRuleSource). + 2) Progressively refine the rule heuristic until the + semi-automated prover no longer needs human input. + 3) Rigorously test. + 4) Convert to pure automated prover. +- Finish commenting. + +- Implement auto-prover strategy + 1 ) goal is to get all formulas on the lhs with the form VAR or ~VAR + 2 ) if rhs is VAR and rhs != any lhs(i) --> notR + 2a) if rhs is VAR = some lhs(i) --> hyp + 3 ) if rhs is & --> andR + 4 ) if rhs is ~X --> notR + 5 ) if rhs is ==> --> impR + 6 ) if rhs is X|~X or ~X|X --> magic + 7 ) if rhs is X|Y and lhs contains only ~(W|Z)'s, VAR's, and ~VAR's + --> orR1, then orR2 if necessary + 8 ) if rhs is X|Y and lhs not described by 7's condition --> notR + 8 ) if rhs is constant (i.e. false)... + 8a) if lhs contains non-basic formulae only of form ~(X|Y) --> notL + 8b) if lhs contains X&Y --> andL + 8c) if lhs contains p and ~p --> notL on ~p + 8d) if lhs contains ~X where X is non-basic, non-OR --> notL + 8e) if lhs contains X==>Y, impL + diff --git a/config.h b/config.h new file mode 100644 index 0000000..0cc278a --- /dev/null +++ b/config.h @@ -0,0 +1,71 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if the system has the type `_Bool'. */ +#define HAVE__BOOL 1 + +/* Name of package */ +#define PACKAGE "lionheart" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "lionheart" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "lionheart 20000916" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "lionheart" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "20000916" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "20000916" + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..f437db3 --- /dev/null +++ b/config.h.in @@ -0,0 +1,70 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/config.h.in~ b/config.h.in~ new file mode 100644 index 0000000..3744b99 --- /dev/null +++ b/config.h.in~ @@ -0,0 +1,64 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/config.log b/config.log new file mode 100644 index 0000000..b254d5b --- /dev/null +++ b/config.log @@ -0,0 +1,572 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by lionheart configure 20000916, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ ./configure + +## --------- ## +## Platform. ## +## --------- ## + +hostname = julian.amyanddavid.net +uname -m = amd64 +uname -r = 6.1 +uname -s = OpenBSD +uname -v = GENERIC.MP#7 + +/usr/bin/uname -p = amd64 +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = OpenBSD.amd64 +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /home/david/bin +PATH: /home/david/.local/bin +PATH: /home/david/.node_modules_global/bin +PATH: /bin +PATH: /sbin +PATH: /usr/bin +PATH: /usr/sbin +PATH: /usr/X11R6/bin +PATH: /usr/local/bin +PATH: /usr/local/sbin +PATH: /usr/local/jdk-1.7.0/bin/ +PATH: /usr/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2284: checking for a BSD-compatible install +configure:2352: result: /usr/bin/install -c +configure:2363: checking whether build environment is sane +configure:2418: result: yes +configure:2569: checking for a thread-safe mkdir -p +configure:2608: result: /usr/local/bin/gmkdir -p +configure:2615: checking for gawk +configure:2631: found /usr/local/bin/gawk +configure:2642: result: gawk +configure:2653: checking whether make sets $(MAKE) +configure:2675: result: yes +configure:2704: checking whether make supports nested variables +configure:2721: result: yes +configure:2911: checking for g++ +configure:2927: found /usr/bin/g++ +configure:2938: result: g++ +configure:2965: checking for C++ compiler version +configure:2974: g++ --version >&5 +g++ (GCC) 4.2.1 20070719 +Copyright (C) 2007 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:2985: $? = 0 +configure:2974: g++ -v >&5 +Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd6.1/4.2.1/specs +Target: amd64-unknown-openbsd6.1 +Configured with: OpenBSD/amd64 system compiler +Thread model: posix +gcc version 4.2.1 20070719 +configure:2985: $? = 0 +configure:2974: g++ -V >&5 +g++: '-V' option must have argument +configure:2985: $? = 1 +configure:2974: g++ -qversion >&5 +g++: unrecognized option '-qversion' +g++: no input files +configure:2985: $? = 1 +configure:3005: checking whether the C++ compiler works +configure:3027: g++ conftest.cpp >&5 +configure:3031: $? = 0 +configure:3079: result: yes +configure:3082: checking for C++ compiler default output file name +configure:3084: result: a.out +configure:3090: checking for suffix of executables +configure:3097: g++ -o conftest conftest.cpp >&5 +configure:3101: $? = 0 +configure:3123: result: +configure:3145: checking whether we are cross compiling +configure:3153: g++ -o conftest conftest.cpp >&5 +configure:3157: $? = 0 +configure:3164: ./conftest +configure:3168: $? = 0 +configure:3183: result: no +configure:3188: checking for suffix of object files +configure:3210: g++ -c conftest.cpp >&5 +configure:3214: $? = 0 +configure:3235: result: o +configure:3239: checking whether we are using the GNU C++ compiler +configure:3258: g++ -c conftest.cpp >&5 +configure:3258: $? = 0 +configure:3267: result: yes +configure:3276: checking whether g++ accepts -g +configure:3296: g++ -c -g conftest.cpp >&5 +configure:3296: $? = 0 +configure:3337: result: yes +configure:3371: checking for style of include used by make +configure:3399: result: GNU +configure:3425: checking dependency style of g++ +configure:3536: result: gcc3 +configure:3599: checking for gcc +configure:3615: found /usr/bin/gcc +configure:3626: result: gcc +configure:3855: checking for C compiler version +configure:3864: gcc --version >&5 +gcc (GCC) 4.2.1 20070719 +Copyright (C) 2007 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +configure:3875: $? = 0 +configure:3864: gcc -v >&5 +Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd6.1/4.2.1/specs +Target: amd64-unknown-openbsd6.1 +Configured with: OpenBSD/amd64 system compiler +Thread model: posix +gcc version 4.2.1 20070719 +configure:3875: $? = 0 +configure:3864: gcc -V >&5 +gcc: '-V' option must have argument +configure:3875: $? = 1 +configure:3864: gcc -qversion >&5 +gcc: unrecognized option '-qversion' +gcc: no input files +configure:3875: $? = 1 +configure:3879: checking whether we are using the GNU C compiler +configure:3898: gcc -c conftest.c >&5 +configure:3898: $? = 0 +configure:3907: result: yes +configure:3916: checking whether gcc accepts -g +configure:3936: gcc -c -g conftest.c >&5 +configure:3936: $? = 0 +configure:3977: result: yes +configure:3994: checking for gcc option to accept ISO C89 +configure:4057: gcc -c -g -O2 conftest.c >&5 +configure:4057: $? = 0 +configure:4070: result: none needed +configure:4095: checking whether gcc understands -c and -o together +configure:4117: gcc -c conftest.c -o conftest2.o +configure:4120: $? = 0 +configure:4117: gcc -c conftest.c -o conftest2.o +configure:4120: $? = 0 +configure:4132: result: yes +configure:4151: checking dependency style of gcc +configure:4262: result: gcc3 +configure:4282: checking how to run the C preprocessor +configure:4313: gcc -E conftest.c +configure:4313: $? = 0 +configure:4327: gcc -E conftest.c +conftest.c:11:28: error: ac_nonexistent.h: No such file or directory +configure:4327: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "lionheart" +| #define PACKAGE_TARNAME "lionheart" +| #define PACKAGE_VERSION "20000916" +| #define PACKAGE_STRING "lionheart 20000916" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "lionheart" +| #define VERSION "20000916" +| /* end confdefs.h. */ +| #include +configure:4352: result: gcc -E +configure:4372: gcc -E conftest.c +configure:4372: $? = 0 +configure:4386: gcc -E conftest.c +conftest.c:11:28: error: ac_nonexistent.h: No such file or directory +configure:4386: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "lionheart" +| #define PACKAGE_TARNAME "lionheart" +| #define PACKAGE_VERSION "20000916" +| #define PACKAGE_STRING "lionheart 20000916" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "lionheart" +| #define VERSION "20000916" +| /* end confdefs.h. */ +| #include +configure:4420: checking for grep that handles long lines and -e +configure:4478: result: /usr/bin/grep +configure:4483: checking for egrep +configure:4545: result: /usr/bin/grep -E +configure:4550: checking for ANSI C header files +configure:4570: gcc -c -g -O2 conftest.c >&5 +configure:4570: $? = 0 +configure:4643: gcc -o conftest -g -O2 conftest.c >&5 +configure:4643: $? = 0 +configure:4643: ./conftest +configure:4643: $? = 0 +configure:4654: result: yes +configure:4667: checking for sys/types.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for sys/stat.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for stdlib.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for string.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for memory.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for strings.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for inttypes.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for stdint.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4667: checking for unistd.h +configure:4667: gcc -c -g -O2 conftest.c >&5 +configure:4667: $? = 0 +configure:4667: result: yes +configure:4681: checking for string.h +configure:4681: result: yes +configure:4693: checking for stdbool.h that conforms to C99 +configure:4760: gcc -c -g -O2 conftest.c >&5 +configure:4760: $? = 0 +configure:4767: result: yes +configure:4769: checking for _Bool +configure:4769: gcc -c -g -O2 conftest.c >&5 +configure:4769: $? = 0 +configure:4769: gcc -c -g -O2 conftest.c >&5 +conftest.c: In function 'main': +conftest.c:58: error: expected expression before ')' token +configure:4769: $? = 1 +configure: failed program was: +| /* confdefs.h */ +| #define PACKAGE_NAME "lionheart" +| #define PACKAGE_TARNAME "lionheart" +| #define PACKAGE_VERSION "20000916" +| #define PACKAGE_STRING "lionheart 20000916" +| #define PACKAGE_BUGREPORT "" +| #define PACKAGE_URL "" +| #define PACKAGE "lionheart" +| #define VERSION "20000916" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_STRING_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((_Bool))) +| return 0; +| ; +| return 0; +| } +configure:4769: result: yes +configure:4780: checking for inline +configure:4796: gcc -c -g -O2 conftest.c >&5 +configure:4796: $? = 0 +configure:4804: result: inline +configure:4827: checking for strcasecmp +configure:4827: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:46: warning: conflicting types for built-in function 'strcasecmp' +configure:4827: $? = 0 +configure:4827: result: yes +configure:4827: checking for strdup +configure:4827: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:47: warning: conflicting types for built-in function 'strdup' +configure:4827: $? = 0 +configure:4827: result: yes +configure:4948: checking that generated files are newer than configure +configure:4954: result: done +configure:4981: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by lionheart config.status 20000916, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on julian.amyanddavid.net + +config.status:863: creating Makefile +config.status:863: creating src/Makefile +config.status:863: creating config.h +config.status:1044: config.h is unchanged +config.status:1092: executing depfiles commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_c_compiler_gnu=yes +ac_cv_c_inline=inline +ac_cv_cxx_compiler_gnu=yes +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_strcasecmp=yes +ac_cv_func_strdup=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdbool_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_objext=o +ac_cv_path_EGREP='/usr/bin/grep -E' +ac_cv_path_GREP=/usr/bin/grep +ac_cv_path_install='/usr/bin/install -c' +ac_cv_path_mkdir=/usr/local/bin/gmkdir +ac_cv_prog_AWK=gawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_CXX=g++ +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cxx_g=yes +ac_cv_prog_make_make_set=yes +ac_cv_type__Bool=yes +am_cv_CC_dependencies_compiler_type=gcc3 +am_cv_CXX_dependencies_compiler_type=gcc3 +am_cv_make_support_nested_variables=yes +am_cv_prog_cc_c_o=yes + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +ACLOCAL='${SHELL} /home/david/devel/cpp/lionheart000916/missing aclocal-1.15' +AMDEPBACKSLASH='\' +AMDEP_FALSE='#' +AMDEP_TRUE='' +AMTAR='$${TAR-tar}' +AM_BACKSLASH='\' +AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +AM_DEFAULT_VERBOSITY='1' +AM_V='$(V)' +AUTOCONF='${SHELL} /home/david/devel/cpp/lionheart000916/missing autoconf' +AUTOHEADER='${SHELL} /home/david/devel/cpp/lionheart000916/missing autoheader' +AUTOMAKE='${SHELL} /home/david/devel/cpp/lionheart000916/missing automake-1.15' +AWK='gawk' +CC='gcc' +CCDEPMODE='depmode=gcc3' +CFLAGS='-g -O2' +CPP='gcc -E' +CPPFLAGS='' +CXX='g++' +CXXDEPMODE='depmode=gcc3' +CXXFLAGS='-g -O2' +CYGPATH_W='echo' +DEFS='-DHAVE_CONFIG_H' +DEPDIR='.deps' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/usr/bin/grep -E' +EXEEXT='' +GREP='/usr/bin/grep' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' +LDFLAGS='' +LIBOBJS='' +LIBS='' +LTLIBOBJS='' +MAKEINFO='${SHELL} /home/david/devel/cpp/lionheart000916/missing makeinfo' +MKDIR_P='/usr/local/bin/gmkdir -p' +OBJEXT='o' +PACKAGE='lionheart' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='lionheart' +PACKAGE_STRING='lionheart 20000916' +PACKAGE_TARNAME='lionheart' +PACKAGE_URL='' +PACKAGE_VERSION='20000916' +PATH_SEPARATOR=':' +SET_MAKE='' +SHELL='/bin/sh' +STRIP='' +VERSION='20000916' +ac_ct_CC='gcc' +ac_ct_CXX='g++' +am__EXEEXT_FALSE='' +am__EXEEXT_TRUE='#' +am__fastdepCC_FALSE='#' +am__fastdepCC_TRUE='' +am__fastdepCXX_FALSE='#' +am__fastdepCXX_TRUE='' +am__include='include' +am__isrc='' +am__leading_dot='.' +am__nodep='_no' +am__quote='' +am__tar='$${TAR-tar} chof - "$$tardir"' +am__untar='$${TAR-tar} xf -' +bindir='${exec_prefix}/bin' +build_alias='' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='${prefix}' +host_alias='' +htmldir='${docdir}' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +install_sh='${SHELL} /home/david/devel/cpp/lionheart000916/install-sh' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +mkdir_p='$(MKDIR_P)' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/usr/local' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target_alias='' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +/* confdefs.h */ +#define PACKAGE_NAME "lionheart" +#define PACKAGE_TARNAME "lionheart" +#define PACKAGE_VERSION "20000916" +#define PACKAGE_STRING "lionheart 20000916" +#define PACKAGE_BUGREPORT "" +#define PACKAGE_URL "" +#define PACKAGE "lionheart" +#define VERSION "20000916" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_STRING_H 1 +#define HAVE__BOOL 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRDUP 1 + +configure: exit 0 + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by lionheart config.status 20000916, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status config.h + +on julian.amyanddavid.net + +config.status:863: creating config.h +config.status:1044: config.h is unchanged diff --git a/config.status b/config.status new file mode 100755 index 0000000..15444df --- /dev/null +++ b/config.status @@ -0,0 +1,1197 @@ +#! /bin/sh +# Generated by configure. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by lionheart $as_me 20000916, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +# Files that config.status was made for. +config_files=" Makefile src/Makefile" +config_headers=" config.h" +config_commands=" depfiles" + +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to the package provider." + +ac_cs_config="" +ac_cs_version="\ +lionheart config.status 20000916 +configured by ./configure, generated by GNU Autoconf 2.69, + with options \"$ac_cs_config\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='/home/david/devel/cpp/lionheart000916' +srcdir='.' +INSTALL='/usr/bin/install -c' +MKDIR_P='/usr/local/bin/gmkdir -p' +AWK='gawk' +test -n "$AWK" || AWK=awk +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +if $ac_cs_recheck; then + set X /bin/sh './configure' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 + CONFIG_SHELL='/bin/sh' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# +AMDEP_TRUE="" ac_aux_dir="." + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && +S["am__EXEEXT_FALSE"]="" +S["am__EXEEXT_TRUE"]="#" +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["EGREP"]="/usr/bin/grep -E" +S["GREP"]="/usr/bin/grep" +S["CPP"]="gcc -E" +S["am__fastdepCC_FALSE"]="#" +S["am__fastdepCC_TRUE"]="" +S["CCDEPMODE"]="depmode=gcc3" +S["ac_ct_CC"]="gcc" +S["CFLAGS"]="-g -O2" +S["CC"]="gcc" +S["am__fastdepCXX_FALSE"]="#" +S["am__fastdepCXX_TRUE"]="" +S["CXXDEPMODE"]="depmode=gcc3" +S["am__nodep"]="_no" +S["AMDEPBACKSLASH"]="\\" +S["AMDEP_FALSE"]="#" +S["AMDEP_TRUE"]="" +S["am__quote"]="" +S["am__include"]="include" +S["DEPDIR"]=".deps" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CXX"]="g++" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CXXFLAGS"]="-g -O2" +S["CXX"]="g++" +S["AM_BACKSLASH"]="\\" +S["AM_DEFAULT_VERBOSITY"]="1" +S["AM_DEFAULT_V"]="$(AM_DEFAULT_VERBOSITY)" +S["AM_V"]="$(V)" +S["am__untar"]="$${TAR-tar} xf -" +S["am__tar"]="$${TAR-tar} chof - \"$$tardir\"" +S["AMTAR"]="$${TAR-tar}" +S["am__leading_dot"]="." +S["SET_MAKE"]="" +S["AWK"]="gawk" +S["mkdir_p"]="$(MKDIR_P)" +S["MKDIR_P"]="/usr/local/bin/gmkdir -p" +S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" +S["STRIP"]="" +S["install_sh"]="${SHELL} /home/david/devel/cpp/lionheart000916/install-sh" +S["MAKEINFO"]="${SHELL} /home/david/devel/cpp/lionheart000916/missing makeinfo" +S["AUTOHEADER"]="${SHELL} /home/david/devel/cpp/lionheart000916/missing autoheader" +S["AUTOMAKE"]="${SHELL} /home/david/devel/cpp/lionheart000916/missing automake-1.15" +S["AUTOCONF"]="${SHELL} /home/david/devel/cpp/lionheart000916/missing autoconf" +S["ACLOCAL"]="${SHELL} /home/david/devel/cpp/lionheart000916/missing aclocal-1.15" +S["VERSION"]="20000916" +S["PACKAGE"]="lionheart" +S["CYGPATH_W"]="echo" +S["am__isrc"]="" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/usr/local" +S["exec_prefix"]="${prefix}" +S["PACKAGE_URL"]="" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="lionheart 20000916" +S["PACKAGE_VERSION"]="20000916" +S["PACKAGE_TARNAME"]="lionheart" +S["PACKAGE_NAME"]="lionheart" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/sh" +_ACAWK +cat >>"$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"lionheart\"" +D["PACKAGE_TARNAME"]=" \"lionheart\"" +D["PACKAGE_VERSION"]=" \"20000916\"" +D["PACKAGE_STRING"]=" \"lionheart 20000916\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["PACKAGE_URL"]=" \"\"" +D["PACKAGE"]=" \"lionheart\"" +D["VERSION"]=" \"20000916\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE__BOOL"]=" 1" +D["HAVE_STRCASECMP"]=" 1" +D["HAVE_STRDUP"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\t (]|$)/ { + line = $ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +} + +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..1a3d2ed --- /dev/null +++ b/configure.ac @@ -0,0 +1,30 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.69]) +AC_INIT([lionheart], [20000916]) +AM_INIT_AUTOMAKE([-Wall -Werror foreign]) +#AC_CONFIG_SRCDIR([main.cc]) +AC_CONFIG_SRCDIR([config.h.in]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([string.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_CHECK_HEADER_STDBOOL +AC_C_INLINE + +# Checks for library functions. +AC_CHECK_FUNCS([strcasecmp strdup]) + +AC_CONFIG_FILES([Makefile + src/Makefile]) +AC_OUTPUT diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..296ba4a --- /dev/null +++ b/log.txt @@ -0,0 +1,5 @@ +05/01/99 - Added "backup" pseudo-rule to allow for correcting mistakes. + - Wrote simple lexer to avoid having to use flex. This one + uses C++ input streams much more cleanly. + - Prettified some of the .h and .cc files with comments. +8/14/99, 11:02 PM -- Trying to add support for "hidden" axioms. Problem: Proof:applyRule does not properly apply axioms (add to lhs). diff --git a/src/Axiom.cc b/src/Axiom.cc new file mode 100644 index 0000000..9ef3dcf --- /dev/null +++ b/src/Axiom.cc @@ -0,0 +1,113 @@ +/* $Id: Axiom.cc,v 1.3 2000/01/24 17:42:52 david Exp $ */ + +/* Axiom.cc + by David Baer, 8/14/99 + Routines for storing and indexing a list of axioms +*/ + +#include +#include +#include "Axiom.h" +#include "parser.h" + +using namespace std; + +#ifndef NULL +#define NULL 0 +#endif + +AxiomTable::AxiomTable(unsigned sz) +{ + tblSize = sz; + data = new AxiomList[tblSize]; +} + +static inline +unsigned hashItem(char *key, unsigned modulus) +{ + unsigned result = 0, i; + + for (i = 0; i < strlen(key); i++) + result = (256 * result + (unsigned)key[i]) % modulus; + + return result; +} + +void AxiomTable::addAxiom(Axiom *ax) +{ + unsigned pos = hashItem(ax->getName(), tblSize); + data[pos].addElement(ax); +} + +void AxiomTable::addAxioms(char *filename) +{ + ifstream istr(filename); + char inbuf[1024]; + + cout << "Reading axioms from " << filename << "... " << flush; + + while (istr.getline(inbuf, 1022)) + { + if (strlen(inbuf) && (inbuf[0] != '#')) + { + char *name = strtok(inbuf, ":"), + *formstr = strtok(NULL, ":"); + + cout << name << " " << flush; + initParser(formstr); + PropFormula *form = parseFormula(); + endParser(); + + this->addAxiom(new Axiom(name, form)); + } + } + cout << endl; + +} + +void AxiomTable::printAxioms(ostream &o) +{ + unsigned i; + + for (i = 0; i < tblSize; i++) + { + unsigned j; + for (j = 0; j < data[i].size(); j++) + { + o << data[i](j)->getName() << ": "; + data[i](j)->getFormula()->println(o); + } + } +} + +Vector AxiomTable::getVector() +{ + unsigned i; + Vector result; + + for (i = 0; i < tblSize; i++) + { + unsigned j; + for (j = 0; j < data[i].size(); j++) + result.addElement(data[i](j)->getFormula()); + } + + return result; +} + +PropFormula *AxiomTable::getAxiom(char *name) +{ + unsigned key = hashItem(name, tblSize), + i; + + for (i = 0; i < data[key].size(); i++) + if (!strcmp(data[key](i)->getName(), name)) + return data[key](i)->getFormula(); + + cerr << "Error! Couldn't find axiom!" << endl; + return NULL; +} + + +AxiomTable axioms; + diff --git a/src/Axiom.h b/src/Axiom.h new file mode 100644 index 0000000..a54ddbf --- /dev/null +++ b/src/Axiom.h @@ -0,0 +1,51 @@ +/* $Id: Axiom.h,v 1.3 2000/01/24 17:42:52 david Exp $ */ + +/* Axiom.h + by David Baer, 8/14/99 + Routines for storing and indexing a list of axioms +*/ + +#ifndef _AXIOM_H +#define _AXIOM_H + +#include +#include "formula.h" +#include "Vector.h" + +using namespace std; + +class Axiom +{ + char *name; + PropFormula *formula; + public: + Axiom(char *n, PropFormula *f) { name = strdup(n); formula = f; } + + char *getName() { return name; } + PropFormula *getFormula() { return formula; } +}; + +typedef Vector AxiomList; + +/* store in hash table, resolve collisions by chaining */ +class AxiomTable +{ + AxiomList *data; + unsigned tblSize; + public: + AxiomTable(unsigned sz = 100); + + void addAxiom(Axiom *); + void addAxioms(char * /* filename */); + + PropFormula *getAxiom(char * /* name */); + + Vector getVector(); + + void printAxioms(ostream &); +}; + +extern +AxiomTable axioms; + +#endif /* !def _AXIOM_H */ diff --git a/src/FormulaRegistry.cc b/src/FormulaRegistry.cc new file mode 100644 index 0000000..012fc6e --- /dev/null +++ b/src/FormulaRegistry.cc @@ -0,0 +1,31 @@ +// $Id: FormulaRegistry.cc,v 1.4 2000/01/24 17:42:52 david Exp $ + +// FormulaRegistry.cc +// Keep track of extra generated formulae in order to facilitate +// killing them off later on. + +#include +#include "FormulaRegistry.h" + +using namespace std; + +void FormulaRegistry::annihilate() +// destroy extra formulae -- broken at present (generates a SEGV) +{ + unsigned i; + + cout << "The following excess formulas will be deleted: " << endl; + for (i = 0; i < list.size(); i++) + list(i)->println(cout); + if (!killed) + for (i = 0; i < list.size(); i++) + { + cout << "deleting: " << flush; + list(i)->println(cout); + delete list(i); + cout << "deleted." << endl; + } + + killed = 1; +} + diff --git a/src/FormulaRegistry.h b/src/FormulaRegistry.h new file mode 100644 index 0000000..b56fe54 --- /dev/null +++ b/src/FormulaRegistry.h @@ -0,0 +1,26 @@ +// $Id: FormulaRegistry.h,v 1.3 2000/01/24 17:42:52 david Exp $ + +// FormulaRegistry.h +// Definitions for a formula registry to keep track of extra +// generated formulae. These can then be deleted at convenience +// with the annhiliate() method. +// (Currently broker) + +#ifndef _FORMULAREGISTRY_H +#define _FORMULAREGISTRY_H + +#include "formula.h" +#include "Vector.h" + +class FormulaRegistry +{ + Vector list; // growable list of formulae + int killed; // set to 1 if formulae already destroyed +public: + FormulaRegistry() { killed = 0; } + void addFormula(PropFormula *f) { list.addElement(f); } + void annihilate(); +}; + +#endif /* !_FORMULAREGISTRY_H */ + diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000..6bd153c --- /dev/null +++ b/src/Makefile @@ -0,0 +1,582 @@ +# Makefile.in generated by automake 1.15 from Makefile.am. +# src/Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994-2014 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/lionheart +pkgincludedir = $(includedir)/lionheart +pkglibdir = $(libdir)/lionheart +pkglibexecdir = $(libexecdir)/lionheart +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +bin_PROGRAMS = lionheart$(EXEEXT) +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_lionheart_OBJECTS = lex.$(OBJEXT) main.$(OBJEXT) formula.$(OBJEXT) \ + parser.$(OBJEXT) ParamSource.$(OBJEXT) Proof.$(OBJEXT) \ + Rule.$(OBJEXT) RuleSource.$(OBJEXT) FormulaRegistry.$(OBJEXT) \ + Options.$(OBJEXT) Axiom.$(OBJEXT) copysplit.$(OBJEXT) +lionheart_OBJECTS = $(am_lionheart_OBJECTS) +lionheart_LDADD = $(LDADD) +AM_V_P = $(am__v_P_$(V)) +am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_$(V)) +am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_$(V)) +am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I. -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_$(V)) +am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_CXXLD = $(am__v_CXXLD_$(V)) +am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +SOURCES = $(lionheart_SOURCES) +DIST_SOURCES = $(lionheart_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = ${SHELL} /home/david/devel/cpp/lionheart000916/missing aclocal-1.15 +AMTAR = $${TAR-tar} +AM_DEFAULT_VERBOSITY = 1 +AUTOCONF = ${SHELL} /home/david/devel/cpp/lionheart000916/missing autoconf +AUTOHEADER = ${SHELL} /home/david/devel/cpp/lionheart000916/missing autoheader +AUTOMAKE = ${SHELL} /home/david/devel/cpp/lionheart000916/missing automake-1.15 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -g -O2 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -g -O2 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /usr/bin/grep -E +EXEEXT = +GREP = /usr/bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LDFLAGS = +LIBOBJS = +LIBS = +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/david/devel/cpp/lionheart000916/missing makeinfo +MKDIR_P = /usr/local/bin/gmkdir -p +OBJEXT = o +PACKAGE = lionheart +PACKAGE_BUGREPORT = +PACKAGE_NAME = lionheart +PACKAGE_STRING = lionheart 20000916 +PACKAGE_TARNAME = lionheart +PACKAGE_URL = +PACKAGE_VERSION = 20000916 +PATH_SEPARATOR = : +SET_MAKE = +SHELL = /bin/sh +STRIP = +VERSION = 20000916 +abs_builddir = /home/david/devel/cpp/lionheart000916/src +abs_srcdir = /home/david/devel/cpp/lionheart000916/src +abs_top_builddir = /home/david/devel/cpp/lionheart000916 +abs_top_srcdir = /home/david/devel/cpp/lionheart000916 +ac_ct_CC = gcc +ac_ct_CXX = g++ +am__include = include +am__leading_dot = . +am__quote = +am__tar = $${TAR-tar} chof - "$$tardir" +am__untar = $${TAR-tar} xf - +bindir = ${exec_prefix}/bin +build_alias = +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host_alias = +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/david/devel/cpp/lionheart000916/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = $(MKDIR_P) +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = ../ +top_builddir = .. +top_srcdir = .. +lionheart_SOURCES = lex.cc main.cc formula.cc parser.cc ParamSource.cc \ + Proof.cc Rule.cc RuleSource.cc FormulaRegistry.cc \ + Options.cc Axiom.cc copysplit.cc + +all: all-am + +.SUFFIXES: +.SUFFIXES: .cc .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign src/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +lionheart$(EXEEXT): $(lionheart_OBJECTS) $(lionheart_DEPENDENCIES) $(EXTRA_lionheart_DEPENDENCIES) + @rm -f lionheart$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(lionheart_OBJECTS) $(lionheart_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/Axiom.Po +include ./$(DEPDIR)/FormulaRegistry.Po +include ./$(DEPDIR)/Options.Po +include ./$(DEPDIR)/ParamSource.Po +include ./$(DEPDIR)/Proof.Po +include ./$(DEPDIR)/Rule.Po +include ./$(DEPDIR)/RuleSource.Po +include ./$(DEPDIR)/copysplit.Po +include ./$(DEPDIR)/formula.Po +include ./$(DEPDIR)/lex.Po +include ./$(DEPDIR)/main.Po +include ./$(DEPDIR)/parser.Po + +.cc.o: + $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CXX)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: + $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# $(AM_V_CXX)source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(AM_V_CXX_no)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: + for dir in "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ + clean-binPROGRAMS clean-generic cscopelist-am ctags ctags-am \ + distclean distclean-compile distclean-generic distclean-tags \ + distdir dvi dvi-am html html-am info info-am install \ + install-am install-binPROGRAMS install-data install-data-am \ + install-dvi install-dvi-am install-exec install-exec-am \ + install-html install-html-am install-info install-info-am \ + install-man install-pdf install-pdf-am install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic pdf pdf-am \ + ps ps-am tags tags-am uninstall uninstall-am \ + uninstall-binPROGRAMS + +.PRECIOUS: Makefile + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..de2b6a4 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,4 @@ +bin_PROGRAMS = lionheart +lionheart_SOURCES = lex.cc main.cc formula.cc parser.cc ParamSource.cc \ + Proof.cc Rule.cc RuleSource.cc FormulaRegistry.cc \ + Options.cc Axiom.cc copysplit.cc diff --git a/src/Markable.h b/src/Markable.h new file mode 100644 index 0000000..5ebfaa5 --- /dev/null +++ b/src/Markable.h @@ -0,0 +1,26 @@ +/* MarkedFormula.h + by David Baer, 7/4/2000 + + Allows us to mark formulas that persist from line 1 to line X of proof chain +*/ + +#ifndef _MARKABLE_H +#define _MARKABLE_H + +class Markable +{ + unsigned long int end; + public: + Markable(unsigned long int n = 0) + { + end = n; + } + + void setEnd(unsigned long int n) + { + end = n; + } +}; + +#endif /* !def _MARKABLE_H */ + diff --git a/src/Options.cc b/src/Options.cc new file mode 100644 index 0000000..e2ec948 --- /dev/null +++ b/src/Options.cc @@ -0,0 +1,112 @@ +/* $Id: Options.cc,v 1.6 2000/01/30 00:59:32 david Exp $ */ + +/* Options.cc + by David Baer + + Parse command line options and convert to an object +*/ + +#include +#include +#include "Options.h" +#include "parser.h" +#include "Axiom.h" + +#define APPNAME "lionheart" +#define MAJ_VER_NUM 0 +#define MIN_VER_NUM "9f" + +Options::Options(int argc, char *argv[]) +{ + form = NULL; + pause_mode = 0; + man_mode = 0; + output_file = NULL; + quiet_mode = 1; + help_req = 0; + dump_mode = 0; + max_param = 100; + use_ind = 0; + + for (int i = 1; i < argc; i++) + if (argv[i][0] != '-') + { + initParser(argv[i]); + form = parseFormula(); + endParser(); + } + else if (!strcmp(argv[i], "-ind")) + { + use_ind = 1; + } + else if (!strcmp(argv[i], "-pause")) + { + pause_mode = 1; + } + else if (!strcmp(argv[i], "-manual")) + { + man_mode = 1; + } + else if (!strncmp(argv[i], "-p", 2)) + { + if (!(i < argc - 1) || !sscanf(argv[i + 1], "%u", &max_param)) + cerr << "warning: -p needs a numerical argument" << endl; + i++; + } + else if (!strncmp(argv[i], "-o", 2)) + { + if (i < argc - 1) + output_file = strdup(argv[i + 1]); + else cerr << "warning: -o needs an argument -- ignored" << endl; + i++; + } + else if (!strncmp(argv[i], "-v", 2)) + { + quiet_mode = 0; + } + else if (!strcmp(argv[i], "-dump")) + { + dump_mode = 1; + } + else if (!strcmp(argv[i], "-a")) + { + if (i < argc - 1) + { + char *axfiles = strdup(argv[i + 1]), + *curFile = strtok(axfiles, ","); + Vector files; + + while (curFile) + { + files.addElement(curFile); + curFile = strtok(NULL, ","); + } + + for (unsigned j = 0; j < files.size(); j++) + axioms.addAxioms(files(j)); + + files.kill(); + + delete axfiles; + } + else cerr << "warning: -a needs an argument -- ignored" << endl; + i++; + } + else help_req = 1; +} + +void Options::syntax() +{ + cout << APPNAME << " " << MAJ_VER_NUM << "." << MIN_VER_NUM << endl; + cout << endl; + cout << "syntax: " << APPNAME << " [-o ] [-q] [-manual] [-dump] []" << endl; + cout << endl; + cout << " : the propositional formula to be proved" << endl; + cout << "-a [,,...] : axiom files" << endl; + cout << "-o : output proof to this text file" << endl; + cout << "-p # : maximum parameter number (default: 100)" << endl; + cout << "-manual : prompt user for proof steps" << endl; + cout << "-v : verbose mode -- all machine steps displayed " << endl; + cout << "-dump : dump proof to standard output" << endl; + cout << endl; +} diff --git a/src/Options.h b/src/Options.h new file mode 100644 index 0000000..c7e0b44 --- /dev/null +++ b/src/Options.h @@ -0,0 +1,38 @@ +/* $Id: Options.h,v 1.5 2000/01/30 00:59:32 david Exp $ */ + +/* Options.h + by David Baer + + Parse command-line options and convert to and object +*/ + +#ifndef _OPTIONS_H +#define _OPTIONS_H + +#include "formula.h" +#include "Vector.h" + +class Options +{ + int man_mode, quiet_mode, help_req, dump_mode, pause_mode, + use_ind; + unsigned max_param; + PropFormula *form; + char *output_file; +public: + Options(int argc, char *argv[]); + void syntax(); + PropFormula *getFormula() { return form; } + int pause() { return pause_mode; } + int manual() { return man_mode; } + int quiet() { return quiet_mode; } + int help() { return help_req; } + int dump() { return dump_mode; } + int induction() { return use_ind; } + char *outputFile() { return output_file; } + unsigned maxParam() { return max_param; } + +}; + +#endif /* !def _OPTIONS_H */ + diff --git a/src/ParamSource.cc b/src/ParamSource.cc new file mode 100644 index 0000000..3a109da --- /dev/null +++ b/src/ParamSource.cc @@ -0,0 +1,11 @@ +/* $Id: ParamSource.cc,v 1.3 2000/01/24 17:42:52 david Exp $ */ + +/* ParamSource.cc + by David Baer + + Object for generating parameters +*/ + +#include "ParamSource.h" + +ParamSource psource; diff --git a/src/ParamSource.h b/src/ParamSource.h new file mode 100644 index 0000000..74168ae --- /dev/null +++ b/src/ParamSource.h @@ -0,0 +1,36 @@ +/* $Id: ParamSource.h,v 1.4 2000/01/25 03:05:43 david Exp $ */ + +/* ParamSource.h + by David Baer + + Generate new (unique) parameter names +*/ + +#ifndef _PARAMSOURCE_H +#define _PARAMSOURCE_H + +#include "formula.h" + +class ParamSource +{ + unsigned count, max; + public: + ParamSource() { count = 0; } + + Var *freshParam() + { + char str[20]; + snprintf(str, 20, "p%u", count++); + + return new Var(str); + } + + void setNext(unsigned n) { if (n > count) count = n; } + unsigned viewNext() { return count; } + void setMax(unsigned m) { max = m; } + unsigned getMax() { return max; } +}; + +extern ParamSource psource; + +#endif /* !def _PARAMSOURCE_H */ diff --git a/src/Proof.cc b/src/Proof.cc new file mode 100644 index 0000000..33c2acb --- /dev/null +++ b/src/Proof.cc @@ -0,0 +1,602 @@ +/* $Id: Proof.cc,v 1.9 2000/01/29 22:33:53 david Exp $ */ + +/* Proof.cc + by David Baer + + Routines for object that applies rules as it is given them +*/ + +#include +#include "Proof.h" +#include "ParamSource.h" +#include "Axiom.h" +#include "copysplit.h" + +using namespace std; + +// constructor (for outside use) +Proof::Proof(PropFormula *f, RuleSource *g, FormulaRegistry *r) +{ + child1 = child2 = NULL; // initialize subgoals to NULL + rhs = f; // set user-specified RHS of sequent + guide = g; // initialize guide + + // if not specified, set up new formula registry + if (!r) + reg = new FormulaRegistry(); + else reg = r; +} + +// for outside use -- takes explicit LHS in addition to other params +Proof::Proof(Vectorl, PropFormula *f, RuleSource *g, + FormulaRegistry *r) +{ + child1 = child2 = NULL; + rhs = f; + lhs = l; + guide = g; + if (!r) + reg = new FormulaRegistry(); + else reg = r; +} + +static inline boolean +rightRule(RuleType r) +{ + return (r == AND_R || + r == OR_R1 || + r == OR_R2 || + r == IMP_R || + r == NOT_R || + r == MAGIC ? true : false); +} + + +ProofReturnCode Proof::prove() +{ + int ruleResult = 0; + + // the following construction requires some explanation: + // we loop endlessly until a "return" is encountered -- + // the only way we can loop is if one of the subgoals returns + // PROOF_BACKUP, meaning that the guide wishes to try a different + // rule for this sequent. Hence the 'while(1)' + while (1) + { + do // loop until an appropriate rule can be applied + { + step = guide->getRule(lhs, rhs); + if (step.getRule() == BACKUP_RULE) + return PROOF_BACKUP; + ruleResult = applyRule(step); + // ruleResult = 1 if rule successfully applied, 0 otherwise + } + while (!ruleResult); + + // did not find proof + if (ruleResult == -1) + return PROOF_FALSE; + else if (ruleResult == -2) // found proof + return PROOF_TRUE; + + // solve subgoals, if applicable + if (child1) + { + ProofReturnCode result1 = child1->prove(); + + // if backing up from subgoal, delete failed subgoal and + // re-try this sequent + if (result1 == PROOF_BACKUP) + { + delete child1; + child1 = NULL; + if (child2) { delete child2; child2 = NULL; } + continue; + } + else if (result1 == PROOF_TRUE) + if (child2) + { + // first, let's check to see whether the step that + // gave us two subgoals was superfluous. If it was, + // then we don't need to check subgoal 2, since it + // won't show up when we print the proof. + if ((step.getTarget() && !step.getTarget()->tagged()) || + (!rhs->tagged() && rightRule(step.getRule()))) + return PROOF_TRUE; + + // otherwise, we're out of luck -- we have to prove the + // second subgoal... + ProofReturnCode result2 = child2->prove(); + if (result2 == PROOF_BACKUP) + { + delete child1; + child1 = NULL; + delete child2; + child2 = NULL; + continue; + } + else if (result2 == PROOF_TRUE) + return PROOF_TRUE; // child1 & child2 are true + else return PROOF_FALSE; // child1 true, child2 false + } + else return PROOF_TRUE; // child1 true + else return PROOF_FALSE; // child1 false + } + else return PROOF_TRUE; // no children -- "hyp" applied ==> true + } +} + +// print out the proof, complete with sequents and rules +void Proof::print(ostream& o, int indent) +{ + boolean superfluous = ((step.getTarget() && + (!step.getTarget()->tagged() || + (step.getTarget()->isQuant() && !step.getTarget()->asQuant()->instantFormula()->tagged()) + )) || + (!rhs->tagged() && rightRule(step.getRule())) ? + true : false), + printed = false; // set to true once something is printed on a line + + if (!reg) + { + o << "error! excess formulas have been cleaned!" << endl; + return; + } + + if (!superfluous) + { + // do indentation + for (int i = 0; i < indent; i++) + o << " "; + + // print left-hand formulae + for (unsigned i = 0; i < lhs.size(); i++) + { + if (lhs(i)->tagged()) + { + lhs(i)->print(o); + printed = true; + } + if (printed && (i < lhs.size() - 1) && lhs(i + 1)->tagged()) + o << ", "; + } + o << " |- "; + + // print right-hand formula + if (rhs->tagged()) + rhs->print(o); + else o << "false"; + + // print rule used here + RuleType type = step.getRule(); + o << " by " << rulename[(int)type]; + + // this commented-out section doesn't work for some reason... + // ... it is an attempt to show which left-hand formulae were + // manipulated by each of the following rules + /*if ((type == AND_L) || + (type == OR_L) || + (type == IMP_L) || + (type == NOT_L)) + o << " " << step.argument() + 1;*/ + + // if we cut in a formula, say what it is! + if (type == CUT) + { + o << " "; + step.getTarget()->print(o); + } + + o << endl; + } + + // if there are two subgoals, set them off with indentation + if (child1 && child2 && + !superfluous // if this step is superflous, we don't need to + // see 2 subgoals (no info gained) + ) + { + child1->print(o, indent + 3); + o << endl; + child2->print(o, indent + 3); + } + // otherwise, just continue with the single subgoal + else if (child1) + child1->print(o, indent); +} + +static inline +QuantFormula *flipQuant(QuantFormula *qf) +// return the logical negation of a quantified formula, with the ~ on the INSIDE +{ + PropFormula *inside; + + if (qf->getFormula()->isQuant()) + inside = flipQuant(qf->getFormula()->asQuant()); + else if (qf->getFormula()->isNot()) + inside = qf->getFormula()->asNot()->notOperand(); + else inside = new Not(qf->getFormula()); + + return new QuantFormula(qf->getType() == QUANT_FORALL ? QUANT_EXISTS : QUANT_FORALL, + qf->getVariable(), inside); +} + + +// attempt to apply the given rule to the sequent +int Proof::applyRule(Rule r) +{ + PropFormula *target = r.getTarget(); // the target of the rule + // (may be a new formula [CUT] + // or an old one [AND_L, etc.] + BinOp *binop = NULL, // binop version of rhs + *binopt = NULL; // binop version of target + + if (r.isProof()) // rule supplies a proof + { + // give it the benefit of the doubt... + child1 = r.getProof(); + return -2; + } + + // do the appropriate pseudo-casts for binary expressions + // for easier access below... + if (rhs->isBinOp()) + binop = rhs->asBinOp(); + if (target) + { + if (target->isBinOp()) + binopt = target->asBinOp(); + } + + // multiplex on rule type + switch (r.getRule()) + { + case AND_L : if (binopt && (binopt->op() == BINOP_AND)) + { + Vector new_lhs = copysplitbut(lhs, target); + new_lhs.addElement(binopt->leftOperand()); + new_lhs.addElement(binopt->rightOperand()); + + // set parent info + binopt->leftOperand()->setParent(binopt); + binopt->rightOperand()->setParent(binopt); + + child1 = new Proof(new_lhs, rhs, guide, reg); + return 1; + } + break; + case AND_R : if (binop && (binop->op() == BINOP_AND)) + { + // set parent info + binop->leftOperand()->setParent(binop); + binop->rightOperand()->setParent(binop); + + child1 = new Proof(copysplit(lhs), binop->leftOperand(), + guide, reg); + child2 = new Proof(copysplit(lhs), binop->rightOperand(), + guide, reg); + return 1; + } + break; + case OR_L : if (binopt && (binopt->op() == BINOP_OR)) + { + Vector new_lhs1 = copysplitbut(lhs, target), + new_lhs2 = copysplit(new_lhs1); + new_lhs1.addElement(binopt->leftOperand()); + new_lhs2.addElement(binopt->rightOperand()); + child1 = new Proof(new_lhs1, rhs, guide, reg); + child2 = new Proof(new_lhs2, rhs, guide, reg); + + // set parent info + binopt->leftOperand()->setParent(binopt); + binopt->rightOperand()->setParent(binopt); + + return 1; + } + break; + case NOT_L : { + Vector new_lhs = copysplitbut(lhs, target); + PropFormula *new_rhs; + + if (target->isNot()) + new_rhs = target->asNot()->notOperand(); + else if (target->isQuant()) + { + /*PropFormula *inside = target->asQuant()->getFormula(); + new_rhs = new QuantFormula(target->asQuant()->getType() == QUANT_FORALL ? QUANT_EXISTS : QUANT_FORALL, + target->asQuant()->getVariable(), + inside->isNot() ? inside->asNot()->notOperand() : new Not(inside));*/ + new_rhs = flipQuant(rhs->asQuant()); + } + else new_rhs = new Not(target); + + // set parent info + new_rhs->setParent(target); + + child1 = new Proof(new_lhs, new_rhs, guide, reg); + return 1; + } + break; + case NOT_R : { + Vector new_lhs = copysplit(lhs); + PropFormula *new_elt; + + if (rhs->isNot()) + new_elt = rhs->asNot()->notOperand(); + else if (rhs->isQuant()) + { + new_elt = flipQuant(rhs->asQuant()); + } + else new_elt = new Not(rhs); + + // set parent info + new_elt->setParent(rhs); + + new_lhs.addElement(new_elt); + child1 = new Proof(new_lhs, new ConstFormula(false), guide, reg); + return 1; + } + break; + case IMP_L : if (binopt && (binopt->op() == BINOP_IMPL)) + { + Vector new_lhs1 = copysplitbut(lhs, target), + new_lhs2 = copysplit(new_lhs1); + new_lhs2.addElement(binopt->rightOperand()); + + // set parent info + binopt->leftOperand()->setParent(binopt); + binopt->rightOperand()->setParent(binopt); + + child1 = new Proof(new_lhs1, binopt->leftOperand(), + guide, reg); + child2 = new Proof(new_lhs2, rhs, guide, reg); + return 1; + } + break; + case OR_R2 : + case OR_R1 : if (binop && (binop->op() == BINOP_OR)) + { + // set parent info + PropFormula *left = binop->leftOperand()->formCopy(), + *right = binop->rightOperand()->formCopy(); + + cout << "holla!" << endl; + + left->setParent(binop); + right->setParent(binop); + + cout << "left: "; + left->print(cout); + cout << " ["; + left->getParent()->print(cout); + cout << "]" << endl; + cout << "right: "; + right->print(cout); + cout << " ["; + right->getParent()->print(cout); + cout << "]" << endl; + + child1 = new Proof(copysplit(lhs), (r.getRule() == OR_R1 ? + left + : right), + guide, reg); + return 1; + } + break; + case OR_R : if (binop && (binop->op() == BINOP_OR)) + { + Vector new_lhs = copysplit(lhs); + PropFormula *new_elt = binop->leftOperand(); + + if (new_elt->isNot()) + new_elt = new_elt->asNot()->notOperand(); + else if (new_elt->isQuant()) + { + new_elt = flipQuant(new_elt->asQuant()); + } + else new_elt = new Not(new_elt); + + // set parent info + new_elt->setParent(binop); + + new_lhs.addElement(new_elt); + + binop->rightOperand()->setParent(binop); + + child1 = new Proof(new_lhs, binop->rightOperand(), + guide, reg); + + return 1; + } + break; + case IMP_R : if (binop && (binop->op() == BINOP_IMPL)) + { + Vector new_lhs = copysplit(lhs); + new_lhs.addElement(binop->leftOperand()); + + // set parent info + binop->leftOperand()->setParent(binop); + binop->rightOperand()->setParent(binop); + + child1 = new Proof(new_lhs, binop->rightOperand(), + guide, reg); + return 1; + } + break; + case HYP : { + unsigned i, result = 0; + for (i = 0; !result && (i < lhs.size()); i++) + if (lhs(i)->equals(rhs)) + { + result = 1; + + // set tags on ancestors (this is a closed branch) + PropFormula *tempPtr = lhs(i); + // cout << "Setting tags on ancestors ... " << endl; + while (tempPtr && !tempPtr->tagged()) + { + // cout << "* "; + // tempPtr->println(cout); + tempPtr->setTag(); + tempPtr = tempPtr->getParent(); + } + + tempPtr = rhs; + while (tempPtr && !tempPtr->tagged()) + { + // cout << "* "; + // tempPtr->println(cout); + tempPtr->setTag(); + tempPtr = tempPtr->getParent(); + } + // cout << endl; + } + return result; + } + case GIVEUP: return -1; + case INSTANT:if (target->isQuant()) + { + QuantFormula *qform = target->asQuant(); + Vector new_lhs; + + if (qform->getType() == QUANT_FORALL) + { + /* cout << "instantiated formula: " << flush;*/ + char paramstr[20]; + snprintf(paramstr, 20, "p%u", r.argument()); + + PropFormula *new_elt = qform->instantiate(new Var(paramstr)); + /* new_elt->println(cout); */ + + /* cout << "old formula: " << flush; + qform->println(cout); */ + qform->incParam(); + + // need to ADD a formula to the list -- can use any parameter + new_lhs = copysplit(lhs); + new_lhs.addElement(new_elt); + + // set parent info + new_elt->setParent(qform); + + //qform->decParam(); // safe after copy + } + else // qform->getType() == QUANT_EXISTS + { + // use fresh parameter + new_lhs = copysplitbut(lhs, target); + + PropFormula *new_elt = qform->instantiate(psource.freshParam()); + + // set parent info + new_elt->setParent(qform); + + new_lhs.addElement(new_elt); + } + + child1 = new Proof(new_lhs, rhs, guide, reg); + return 1; + } + break; + case AXIOM : { + Vector new_lhs = copysplit(lhs); + PropFormula *new_ax = target; + + if (new_ax) + { + new_lhs.addElement(new_ax); + child1 = new Proof(new_lhs, rhs, guide, reg); + return 1; + } + else return 0; + } + case IND : { + Vector new_lhs1 = copysplit(lhs), + new_lhs2 = copysplit(lhs); + PropFormula *zero = r.getInductionZero(), + *succ = r.getInductionSucc(), + *new_rhs1, *new_rhs2; + Var *iV = new Var("i"), *jV = new Var("j"); + Var *zeroV = psource.freshParam(), + *lastV = psource.freshParam(), + *nextV = psource.freshParam(); + + if (!zero || !succ) + cout << "Still not fixed!" << endl; + + zero->println(cout); + succ->println(cout); + + if (zero && succ && rhs->isQuant() && (rhs->asQuant()->getType() == QUANT_FORALL)) + { + new_lhs1.addElement(zero->replace(iV, zeroV)); + new_lhs2.addElement(succ->replace(iV, lastV)-> + replace(jV, nextV)); + delete iV; + delete jV; + new_rhs1 = rhs->asQuant()->instantiate(zeroV); + new_rhs2 = rhs->asQuant()->instantiate(nextV); + new_lhs2.addElement(rhs->asQuant()->instantiate(lastV)); + + child1 = new Proof(new_lhs1, new_rhs1, guide, reg); + child2 = new Proof(new_lhs2, new_rhs2, guide, reg); + + return 1; + } + else return 0; + } + case CUT : { + Vector new_lhs = copysplit(lhs); + reg->addFormula(target); + new_lhs.addElement(target); + child1 = new Proof(target, guide, reg); + child2 = new Proof(new_lhs, rhs, guide, reg); + return 1; + } + case MAGIC : if (rhs->isBinOp() && (rhs->asBinOp()->op() == BINOP_OR)) + { + BinOp *formula = rhs->asBinOp(); + if (formula->rightOperand()->isNot()) + return formula->rightOperand()->asNot()-> + notOperand()->equals(formula->leftOperand()); + else if (formula->leftOperand()->isNot()) + return formula->leftOperand()->asNot()-> + notOperand()->equals(formula->rightOperand()); + + // set tags on ancestors (this is a closed branch) + PropFormula *tempPtr = rhs; + while (tempPtr) + { + tempPtr->setTag(); + tempPtr = tempPtr->getParent(); + } + } + break; + default : cerr << "Rule " << rulename[(int)r.getRule()] + << "not supported yet!" << endl; + } + return 0; +} + +void Proof::cleanup() +{ + if (child1) + delete child1; + if (child2) + delete child2; + if (reg) + { + reg->annihilate(); + delete reg; + reg = NULL; + } +} + +Proof::~Proof() +{ + if (child1) + delete child1; + if (child2) + delete child2; +} + diff --git a/src/Proof.h b/src/Proof.h new file mode 100644 index 0000000..03b085f --- /dev/null +++ b/src/Proof.h @@ -0,0 +1,67 @@ +// $Id: Proof.h,v 1.3 2000/01/24 17:42:52 david Exp $ + +// Proof.h +// Proof construct + +#ifndef _PROOF_H +#define _PROOF_H + +#include "Rule.h" +#include "RuleSource.h" +#include "Vector.h" +#include "FormulaRegistry.h" +#include "formula.h" + +// sometimes C++ can be braindead... +#ifndef NULL +#define NULL 0 +#endif /* !def NULL */ + +// enumerated type to encode proof results +typedef enum +{ + PROOF_FALSE = 0, + PROOF_TRUE, + PROOF_BACKUP +} ProofReturnCode; + +class Proof +{ + Vector lhs; // the lefthand side of the turnstyle + PropFormula *rhs; // the righthand side -- a single formula + Proof *child1, // proof can have 2 subgoals + *child2; + RuleSource *guide; // this abstraction supplies the rules + Rule step; // the step taken at this stage (from guide) + FormulaRegistry *reg; // the global registry of extra formulae +public: + + // constructor (for outside use) -- setup proof for a single formula + Proof(PropFormula *f, RuleSource *g, FormulaRegistry *r = NULL); + + // constructor (for internal use) -- setup a proof subgoal + Proof(Vectorl, PropFormula *f, RuleSource *g, + FormulaRegistry *r = NULL); + + // apply a given rule + int applyRule(Rule); // 0 = invalid rule, 1 = valid rule + + // try to prove this seqent with rules from guide + ProofReturnCode prove(); + + // print this sequent + void print(ostream& o, int indent = 0); + void println(ostream& o, int indent = 0) + { + print(o, indent); + o << endl; + } + + void cleanup(); // delete excess formulas + + // class destructor + ~Proof(); +}; + +#endif /* !_PROOF_H */ + diff --git a/src/Rule.cc b/src/Rule.cc new file mode 100644 index 0000000..7ba377e --- /dev/null +++ b/src/Rule.cc @@ -0,0 +1,24 @@ +// $Id: Rule.cc,v 1.4 2000/01/29 22:33:53 david Exp $ + +// Rule.cc +// Sadly, there is nothing here but the names of the rules. + +const char *rulename[] = { "andL", + "andR", + "orL", + "orR1", + "orR2", + "orR", + "impL", + "impR", + "notL", + "notR", + "cut", + "magic", + "hyp", + "instantiation", + "induction", + "axiom", + "giveup", + "backup" }; + diff --git a/src/Rule.h b/src/Rule.h new file mode 100644 index 0000000..6955d65 --- /dev/null +++ b/src/Rule.h @@ -0,0 +1,120 @@ +// $Id: Rule.h,v 1.7 2000/01/30 00:59:32 david Exp $ + +// Rule.h +// Abstraction type for refinement-logic rules + +#ifndef _RULE_H +#define _RULE_H + +#include "formula.h" +#include + +// types of rules -- the standard refinement logic set plus a few +// pseudo-rules +typedef enum +{ + AND_L, + AND_R, + OR_L, + OR_R1, + OR_R2, + OR_R, + IMP_L, + IMP_R, + NOT_L, + NOT_R, + CUT, + MAGIC, + HYP, + INSTANT, + IND, + AXIOM, + GIVEUP, // exit proof + BACKUP_RULE // backup to last subgoal +} RuleType; + +// rule names -- used for printing +extern const char *rulename[]; + +class Proof; // used in class Rule + +class Rule +{ + RuleType rule; + PropFormula *target; + PropFormula *indZero, *indSucc; + Proof *pf; + Var *var; + int arg; + char *axname; +public: + Rule() + { + rule = AND_L; + target = indZero = indSucc = NULL; + arg = 2; + pf = NULL; + var = NULL; + } + Rule(RuleType r, PropFormula *t, int a=-1, Proof *p = NULL) + { + rule = r; + target = t; + arg = a; + pf = p; + var = NULL; + indZero = indSucc = NULL; + } + Rule(RuleType r, PropFormula *t, char *name) + { + rule = r; + axname = strdup(name); + pf = NULL; + target = t; + var = NULL; + indZero = indSucc = NULL; + } + + // constructor for induction + Rule(RuleType r, PropFormula *iZ, PropFormula *iS) + { + rule = r; + indZero = iZ; + indSucc = iS; + pf = NULL; + target = NULL; + var = NULL; + } + + void setArg(int a) { arg = a; } + char *getName() { return axname; } + + Var *getVar() { return this->var; } + PropFormula *getTarget() { return target; } + PropFormula *getInductionZero() { return indZero; } + PropFormula *getInductionSucc() { return indSucc; } + RuleType getRule() { return rule; } + Rule& operator=(Rule r) + { + rule = r.rule; + target = r.target; + pf = r.pf; + arg = r.arg; + axname = r.axname; + indZero = r.indZero; + indSucc = r.indSucc; + + return *this; + } + int argument() { return arg; } + virtual boolean isProof() + { + return pf != NULL; + } + virtual Proof *getProof() + { + return pf; + } +}; + +#endif /* !_RULE_H */ diff --git a/src/RuleSource.cc b/src/RuleSource.cc new file mode 100644 index 0000000..8b898de --- /dev/null +++ b/src/RuleSource.cc @@ -0,0 +1,597 @@ +// $Id: RuleSource.cc,v 1.10 2000/01/30 00:59:32 david Exp $ + +// RuleSource.cc +// routines for supplying rules for refinement logic proofs + +#include +#include "RuleSource.h" +#include "parser.h" +#include "Proof.h" +#include "ParamSource.h" +#include "Axiom.h" + +#ifndef NULL +#define NULL 0 +#endif /* !_NULL */ + +using namespace std; + +// When the user wants to apply a left-rule, sometimes there is more +// than one possible target. This routine lists all the +// possibilities and prompts the user for his/her choice. +unsigned UserRuleSource::getFormula(Vector v, Vector possible) +{ + unsigned result, done = 0, i; + + while (!done) + { + for (i = 0; i < possible.size(); i++) + { + *ostr << possible(i) + 1 << ") "; + v(possible(i))->println(*ostr); + } + *ostr << "which formula on left? "; + *istr >> result; + for (i = 0; !done && (i < possible.size()); i++) + done = (result == (possible(i) + 1)); + } + + char nullstr[20]; + + istr->getline(nullstr, 18); + + + return result - 1; +} + +unsigned UserRuleSource::getInstantParam() +{ + char instring[100]; + unsigned num; + + *ostr << "enter a parameter for instantiation: p"; + + istr->getline(instring, 98); + + sscanf(instring, "%u", &num); + + psource.setNext(num + 1); // ensure freshness for fresh parameters + + return num; +} + +Rule UserRuleSource::getRule(Vector l, PropFormula *r) +{ + char inbuf[100]; + + while (1) // get good rule + { + for (unsigned i = 0; i < l.size(); i++) + { + l(i)->print(*ostr); + if (i < l.size() - 1) + *ostr << ", "; + } + *ostr << " |- "; + r->print(*ostr); + *ostr << " by "; + istr->getline(inbuf, 98); + if (!strcasecmp(inbuf, "andr")) + { + Rule result(AND_R, NULL); + return result; + } + else if (!strcasecmp(inbuf, "orr1")) + { + Rule result(OR_R1, NULL); + return result; + } + else if (!strcasecmp(inbuf, "orr2")) + { + Rule result(OR_R2, NULL); + return result; + } + else if (!strcasecmp(inbuf, "orr")) + { + Rule result(OR_R, NULL); + return result; + } + else if (!strcasecmp(inbuf, "impr")) + { + Rule result(IMP_R, NULL); + return result; + } + else if (!strcasecmp(inbuf, "notr")) + { + Rule result(NOT_R, NULL); + return result; + } + else if (!strcasecmp(inbuf, "andl")) + { + if (l.size() == 0) continue; // nothing on lhs! + unsigned which; + Vector possible; + for (which = 0; which < l.size(); which++) + if (l(which)->isBinOp() && (l(which)->asBinOp()->op() == BINOP_AND)) + possible.addElement(which); + if (possible.size() == 0) + which = 0; + else if (possible.size() == 1) + which = possible(0); + else which = getFormula(l, possible); + + Rule result(AND_L, l(which), which); + return result; + } + else if (!strcasecmp(inbuf, "orl")) + { + if (l.size() == 0) continue; // nothing on lhs! + unsigned which; + Vector possible; + for (which = 0; which < l.size(); which++) + if (l(which)->isBinOp() && (l(which)->asBinOp()->op() == BINOP_OR)) + possible.addElement(which); + if (possible.size() == 0) + which = 0; + else if (possible.size() == 1) + which = possible(0); + else which = getFormula(l, possible); + + Rule result(OR_L, l(which), which); + return result; + } + else if (!strcasecmp(inbuf, "impl")) + { + if (l.size() == 0) continue; // nothing on lhs! + unsigned which; + Vector possible; + for (which = 0; which < l.size(); which++) + if (l(which)->isBinOp() && (l(which)->asBinOp()->op() == BINOP_IMPL)) + possible.addElement(which); + if (possible.size() == 0) + which = 0; + else if (possible.size() == 1) + which = possible(0); + else which = getFormula(l, possible); + + Rule result(IMP_L, l(which), which); + return result; + } + else if (!strcasecmp(inbuf, "notl")) + { + if (l.size() == 0) continue; // nothing on lhs! + unsigned which; + Vector possible; + for (which = 0; which < l.size(); which++) + possible.addElement(which); + if (possible.size() == 0) + which = 0; + else if (possible.size() == 1) + which = possible(0); + else which = getFormula(l, possible); + + Rule result(NOT_L, l(which), which); + return result; + } + else if (!strcasecmp(inbuf, "instant")) + { + if (l.size() == 0) continue; + unsigned which; + Vector possible; + for (which = 0; which < l.size(); which++) + if (l(which)->isQuant()) + possible.addElement(which); + if (possible.size() == 0) + which = 0; + else if (possible.size() == 1) + which = possible(0); + else which = getFormula(l, possible); + + /*Var *p = (l(which)->asQuant()->getType() == QUANT_EXISTS ? NULL : getInstantParam());*/ + unsigned param; + if (l(which)->isQuant()) + param = (l(which)->asQuant()->getType() == QUANT_EXISTS ? 0 : getInstantParam()); + else param = 0; + + /*if (!p) + cout << "p == NULL" << endl;*/ + + Rule result(INSTANT, l(which), param); + + return result; + } + else if (!strcasecmp(inbuf, "ind")) + { + if (!r->isQuant() || (r->asQuant()->getType() != QUANT_FORALL)) + continue; + + char zeroStr[128], succStr[128]; + + *ostr << "zero(i) <==> " << flush; + *istr >> zeroStr; + initParser(zeroStr); + PropFormula * zero_pred = parseFormula(); + endParser(); + + *ostr << "succ(i, j) <==> " << flush; + *istr >> succStr; + initParser(succStr); + PropFormula * succ_pred = parseFormula(); + endParser(); + + *ostr << "Thanks!" << endl; + + Rule result(IND, zero_pred, succ_pred); + + /**ostr << "zero: " << flush; + result.getInductionZero()->println(*ostr); + *ostr << "succ: " << flush; + result.getInductionSucc()->println(*ostr);*/ + + return result; + } + else if (!strcasecmp(inbuf, "axiom")) + { + axioms.printAxioms(*ostr); + *ostr << "which one? " << flush; + char name[40]; + istr->getline(name, 38); + PropFormula *ax = axioms.getAxiom(name); + + *ostr << "New axiom: " << flush; + ax->println(*ostr); + + if (ax) + { + Rule result(AXIOM, ax, name); + return result; + } + else continue; + } + else if (!strcasecmp(inbuf, "hyp")) + { + Rule result(HYP, NULL); + return result; + } + else if (!strcasecmp(inbuf, "giveup")) + { + Rule result(GIVEUP, NULL); + return result; + } + else if (!strcasecmp(inbuf, "cut")) + { + *ostr << "Enter formula: " << flush; + initParser(*istr); + Rule result(CUT, parseFormula()); + endParser(); + return result; + } + else if (!strcasecmp(inbuf, "magic")) + { + Rule result(MAGIC, NULL); + return result; + } + else if (!strcasecmp(inbuf, "backup")) + { + Rule result(BACKUP_RULE, NULL); + return result; + } + else + { + Rule result(AND_R, NULL); + return result; + } + } +} + + +/*int order[] = { 1, 4, 3, 6, 7, 5, 2, 8, 9, 10, 11, 12, 13 };*/ +PropFormula *basicTarget = NULL; + +unsigned isBasic(Vectorlist) +{ + unsigned i, finalresult = 1, result = 1; + + //cout << "checking list..." << endl; + basicTarget = NULL; + + for (i = 0; i < list.size(); i++) + { + //list(i)->println(cout); + unsigned temp = list(i)->isNot() && + list(i)->asNot()->notOperand()->isBinOp() && + (list(i)->asNot()->notOperand()->asBinOp()->op() == BINOP_OR); + result = list(i)->isVar() || list(i)->isQuant() || + list(i)->isNot() && list(i)->asNot()->notOperand()->isVar() || + temp; + + if (result && temp && (basicTarget == NULL)) + basicTarget = list(i); + else if (!result) + if (!basicTarget) + basicTarget = list(i); + else if (basicTarget->isBinOp() && list(i)->isBinOp() && + ((unsigned)basicTarget->asBinOp()->op() > (unsigned)list(i)->asBinOp()->op())) + basicTarget = list(i); + finalresult &= result; + } + + //cout << "done, list is" << (finalresult ? " " : " not ") << "basic" << endl; + + + return finalresult; +} + +Rule AutoRuleSource::getRule(Vectorlhs, PropFormula *rhs) +{ + unsigned i, basic_lhs = isBasic(lhs); + RuleType result = GIVEUP; + PropFormula *target = NULL; + Proof *pftarget = NULL; + PropFormula *zero = NULL, *succ = NULL; + + if (rhs->isVar() || rhs->isQuant()) + { + for (i = 0; i < lhs.size(); i++) + if (lhs(i)->equals(rhs)) + result = HYP; + if (result == GIVEUP) + { + result = NOT_R; + if (induct && rhs->isQuant() && (rhs->asQuant()->getType() == QUANT_FORALL)) + { + Vector v; + v.addElement(new Var("i")); + zero = new BinOp(BINOP_AND, new Pred("Integer", v), new Pred("Zero", v)); + v.addElement(new Var("j")); + Vector w; + w.addElement(new Var("i")); + succ = new BinOp(BINOP_AND, new Pred("Integer", w), new Pred("Succ", v)); + + result = IND; + } + } + } + + if ((result == GIVEUP) && rhs->isBinOp()) + { + if (rhs->asBinOp()->op() == BINOP_AND) + result = AND_R; + if (rhs->asBinOp()->op() == BINOP_IMPL) + result = IMP_R; + if (rhs->asBinOp()->op() == BINOP_OR) + result = OR_R; + + /* This code is commented out because it used the standard */ + /* refinement-logic ORR1 and ORR2, which gets clumsy if you */ + /* can't guess which to use, and harmful as in the case of */ + /* p|~p. */ + /* + { + PropFormula *left = rhs->asBinOp()->leftOperand(), + *right = rhs->asBinOp()->rightOperand(); + + if ((left->isNot() && (left->asNot()->notOperand()->equals(right))) || + (right->isNot() && (right->asNot()->notOperand()->equals(left)))) + result = MAGIC; + } + */ + } + + if ((result == GIVEUP) && rhs->isNot()) + { + result = NOT_R; + } + + /* The new code will never get this far. OR is handled above. */ + /* + if ((result == GIVEUP) && + rhs->isBinOp() && + (rhs->asBinOp()->op() == BINOP_OR)) + { + if (basic_lhs) + { + PropFormula *new_rhs = rhs->asBinOp()->leftOperand()->formCopy(); + + new_rhs->setParent(rhs); + + Proof *attempt = new Proof(lhs, new_rhs, this); + if (attempt->prove() == PROOF_TRUE) + { + pftarget = attempt; + target = rhs; + result = OR_R1; + } + if (result == GIVEUP) + { + delete attempt; // lhs of or was unsuccessful + + new_rhs = rhs->asBinOp()->rightOperand()->formCopy(); + new_rhs->setParent(rhs); + + attempt = new Proof(lhs, new_rhs, this); + if (attempt->prove() == PROOF_TRUE) + { + pftarget = attempt; + target = rhs; + result = OR_R2; + } + if (result == GIVEUP) + delete attempt; // rhs of or was unsuccessful + } + } + if (result == GIVEUP) + { + //if (basicTarget->isNot()) + //{ + // target = basicTarget; + // result = NOT_L; + //} + if (!basic_lhs && rhs->isBinOp() && (rhs->asBinOp()->op() == BINOP_OR)) + { + result = NOT_R; + } + + if (basicTarget) + { + + if (basicTarget->isBinOp() && (basicTarget->asBinOp()->op() == BINOP_OR)) + { + target = basicTarget; + result = OR_L; + } + + if (basicTarget->isBinOp() && (basicTarget->asBinOp()->op() == BINOP_AND)) + { + target = basicTarget; + result = AND_L; + } + + if (basicTarget->isBinOp() && (basicTarget->asBinOp()->op() == BINOP_IMPL)) + { + target = basicTarget; + result = IMP_L; + } + } + + } + } + */ + + if ((result == GIVEUP) && + rhs->isConst()) + { + if (basic_lhs && basicTarget) + { + target = basicTarget; + //cout << "boo!" << basic_lhs << endl; + result = NOT_L; + } + else if (!basic_lhs && basicTarget) + { + if (basicTarget->isBinOp()) + { + if (basicTarget->asBinOp()->op() == BINOP_AND) + { + target = basicTarget; + result = AND_L; + } + if (basicTarget->asBinOp()->op() == BINOP_OR) + { + target = basicTarget; + result = OR_L; + } + + if (basicTarget->asBinOp()->op() == BINOP_IMPL) + { + target = basicTarget; + result = IMP_L; + } + } + if (basicTarget->isNot()) + { + target = basicTarget; + result = NOT_L; + } + + } + } + + if (result == GIVEUP) + { + unsigned j; + + for (i = 0; (result == GIVEUP) && (i < lhs.size()); i++) + { + for (j = i + 1; (result == GIVEUP) && (j < lhs.size()); j++) + if (lhs(i)->isNot() && + lhs(i)->asNot()->notOperand()->isVar() && + lhs(j)->isVar() && + lhs(i)->asNot()->notOperand()->equals(lhs(j))) + { + target = lhs(i); + result = NOT_L; + } + else if (lhs(j)->isNot() && + lhs(j)->asNot()->notOperand()->isVar() && + lhs(i)->isVar() && + lhs(j)->asNot()->notOperand()->equals(lhs(i))) + { + target = lhs(j); + result = NOT_L; + } + } + } + + if (result == GIVEUP) + { + for (i = 0; (result == GIVEUP) && (i < lhs.size()); i++) + { + if (lhs(i)->isQuant() && + (lhs(i)->asQuant()->getType() == QUANT_EXISTS)) + { + target = lhs(i); + if (psource.viewNext() <= psource.getMax()) + result = INSTANT; + else result = GIVEUP; + } + } + } + + if (result == GIVEUP) + { + unsigned min = 0; + target = NULL; + + for (i = 0; i < lhs.size(); i++) + if (lhs(i)->isQuant() && + (lhs(i)->asQuant()->getType() == QUANT_FORALL)) + { + if ((lhs(i)->asQuant()->nextParam() < min) || !target) + { + target = lhs(i); + result = INSTANT; + min = lhs(i)->asQuant()->nextParam(); + } + } + if ((result == INSTANT) && (min > psource.getMax())) + result = GIVEUP; + } + + if (result == GIVEUP) + { + // don't prompt user -- GIVEUP serves a useful purpose, esp. with OR + // return UserRuleSource::getRule(lhs, rhs); + } + + if (!quiet) + { + for (i = 0; i < lhs.size(); i++) + { + lhs(i)->print(*ostr); + if (i < lhs.size() - 1) *ostr << ", " << flush; + } + *ostr << " |- "; + rhs->print(*ostr); + *ostr << " by " << rulename[(unsigned)result] << flush << endl; + if (pause) + { + char strbuf[100]; + *istr >> strbuf; + } + } + if (!pftarget && (result != IND)) + if ((result == INSTANT) && (target->asQuant()->getType() == QUANT_FORALL)) + { + if (target->asQuant()->nextParam() > psource.getMax()) + result = GIVEUP; + + Rule r(result, target, target->asQuant()->nextParam()); + return r; + } + else return Rule(result, target); + else if (result == IND) + return Rule(IND, zero, succ); + else return Rule(result, target, -1, pftarget); +} + diff --git a/src/RuleSource.h b/src/RuleSource.h new file mode 100644 index 0000000..e5a9dcd --- /dev/null +++ b/src/RuleSource.h @@ -0,0 +1,46 @@ +// $Id: RuleSource.h,v 1.5 2000/01/30 00:59:32 david Exp $ + +// RuleSource.h +// An abstraction used for analyzing sequents and supplying rules. + +#ifndef _RULESOURCE_H +#define _RULESOURCE_H + +#include +#include "Rule.h" +#include "formula.h" +#include "Vector.h" + +using namespace std; + +// all we need in the abstract class is a method for returning rules +class RuleSource +{ +public: + virtual Rule getRule(Vector, PropFormula*)=0; +}; + +// A user-assisted rule source -- done +class UserRuleSource : virtual public RuleSource +{ +protected: + istream *istr; // input stream + ostream *ostr; // output stream +public: + UserRuleSource(istream &i, ostream &o) { istr = &i; ostr = &o; } + Rule getRule(Vector, PropFormula*); +private: + unsigned getFormula(Vector, Vector); + unsigned getInstantParam(); +}; + +class AutoRuleSource : virtual public UserRuleSource +{ + unsigned quiet, pause, induct; +public: + AutoRuleSource(istream &i = cin, ostream &o = cout, unsigned q = 0, unsigned p = 0, unsigned in = 0) : UserRuleSource(i, o) { quiet = q; pause = p; induct = in; } + Rule getRule(Vector, PropFormula*); +}; + +#endif /* !_RULESOURCE_H */ + diff --git a/src/Vector.h b/src/Vector.h new file mode 100644 index 0000000..33ef87b --- /dev/null +++ b/src/Vector.h @@ -0,0 +1,103 @@ +// $Id: Vector.h,v 1.3 2000/01/24 17:42:52 david Exp $ + +// Vector.h +// A growable list, somewhat like Java Vectors + +#ifndef _VECTOR_H +#define _VECTOR_H + +template +class Vector +{ + T *data; + unsigned num_elt, next; +private: + void setSize(unsigned i) + { + T *temp = new T[i]; + memcpy(temp, data, sizeof(T) * next); + delete data; + data = temp; + num_elt = i; + } +public: + Vector(unsigned len = 10) + { + data = new T[len]; + num_elt = len; + next = 0; + } + + T& operator()(unsigned i) { return data[i]; } + unsigned size() { return next; } + void addElement(T thing) + { + if (next < num_elt) + data[next++] = thing; + else + { + setSize(num_elt * 2); + addElement(thing); + } + } + + void kill() { delete data; } + + Vector operator=(Vector v) + { + data = v.data; + num_elt = v.num_elt; + next = v.next; + return *this; + } + + ~Vector() { } +}; + +template +inline Vector copy(Vector v) +{ + unsigned i; + Vector result; + + for (i = 0; i < v.size(); i++) + result.addElement(v(i)); + + return result; +} + +template +inline Vector copyBut(Vector v, T exception) +{ + unsigned i; + Vector result; + + for (i = 0; i < v.size(); i++) + if (v(i) != exception) + result.addElement(v(i)); + + return result; +} + +template +inline void vectorReplace(Vector v, T oldItem, T newItem) +{ + unsigned i; + + for (i = 0; i < v.size(); i++) + if (v(i) == oldItem) + v(i) = newItem; + +} + +template +inline void vectorAppend(Vector & v1, Vector v2) +{ + unsigned i; + + for (i = 0; i < v2.size(); i++) + v1.addElement(v2(i)); +} + + +#endif /* !_VECTOR_H */ diff --git a/src/copysplit.cc b/src/copysplit.cc new file mode 100644 index 0000000..48bfb2e --- /dev/null +++ b/src/copysplit.cc @@ -0,0 +1,33 @@ +#include "copysplit.h" + +using namespace std; + +Vector copysplit(Vector v) +{ + Vector result; + unsigned i; + + for (i = 0; i < v.size(); i++) + { + result.addElement(v(i)->formCopy()); + } + + return result; + +} + +Vector copysplitbut(Vector v, PropFormula *but) +{ + Vector result; + unsigned i; + + for (i = 0; i < v.size(); i++) + { + if (v(i) != but) + result.addElement(v(i)->formCopy()); + } + + return result; + +} + diff --git a/src/copysplit.h b/src/copysplit.h new file mode 100644 index 0000000..e748cc3 --- /dev/null +++ b/src/copysplit.h @@ -0,0 +1,13 @@ +#ifndef _COPYSPLIT_H +#define _COPYSPLIT_H + +#include "Vector.h" +#include "formula.h" + +extern Vector +copysplit(Vector); + +extern Vector +copysplitbut(Vector, PropFormula*); + +#endif /* !def _COPYSPLIT_H */ diff --git a/src/formula.cc b/src/formula.cc new file mode 100644 index 0000000..8d7fde9 --- /dev/null +++ b/src/formula.cc @@ -0,0 +1,237 @@ +// $Id: formula.cc,v 1.5 2000/01/25 03:05:43 david Exp $ + +// formula.cc +// +// mostly print methods for formula classes +#include +#include "formula.h" + +void PropFormula::println(ostream & o) +{ + print(o); + o << endl; +} + +void Var::print(ostream & o) +{ + o << name; +} + +boolean Var::equals(PropFormula *formula) +{ + if (formula->isVar() == false) + return false; + Var *v = formula->asVar(); + if (!strcmp(v->name, name)) return true; + return false; +} + +PropFormula *Var::replace(Var *v, Var *r) +{ + if (this->equals(v)) + { + PropFormula *result = r->formCopy(); + + result->setParent(this); + + return result; + } + else return this->formCopy(); +} + +void Pred::print(ostream & o) +{ + if (!strcmp(this->varName(), "Equal") && (getParams().size() == 2)) + { + o << "("; + getParams()(0)->print(o); + o << " = "; + getParams()(1)->print(o); + o << ")"; + } + else + { + Var::print(o); + o << "("; + unsigned i; + + for (i = 0; i < getParams().size(); i++) + { + getParams()(i)->print(o); + if (i < getParams().size() - 1) + o << ", "; + } + o << ")"; + } +} + +boolean Pred::equals(PropFormula *formula) +{ + if (Var::equals(formula) == false) + return false; + if (formula->asVar()->isPred() == false) + return false; + Pred *pf = formula->asVar()->asPred(); + + if (pf->getParams().size() != getParams().size()) + return false; + + unsigned i; + + for (i = 0; i < getParams().size(); i++) + if (!getParams()(i)->equals(pf->getParams()(i))) + return false; + + return true; +} + +PropFormula * Pred::replace(Var *v, Var *r) +{ + unsigned i; + Pred *temp = this->formCopy()->asVar()->asPred(); + + for (i = 0; i < temp->getParams().size(); i++) + if (temp->getParams()(i)->equals(v)) + { + //delete temp->getParams()(i); + temp->getParams()(i) = r; + } + + temp->setParent(this); + + return temp; +} + +void Not::print(ostream & o) +{ + o << "~"; + operand->print(o); + o << flush; +} + +boolean Not::equals(PropFormula *formula) +{ + if (formula->isNot() == false) + return false; + Not *v = formula->asNot(); + return operand->equals(v->operand); +} + +void BinOp::print(ostream & o) +{ + o << "("; + if ((opr == BINOP_AND) && + left->isBinOp() && + (left->asBinOp()->op() == BINOP_IMPL) && + right->isBinOp() && + (right->asBinOp()->op() == BINOP_IMPL) && + (right->asBinOp()->leftOperand()->equals(left->asBinOp()->rightOperand())) && + (right->asBinOp()->rightOperand()->equals(left->asBinOp()->leftOperand()))) + { + left->asBinOp()->leftOperand()->print(o); + o << " <==> "; + left->asBinOp()->rightOperand()->print(o); + } + else + { + left->print(o); + switch(opr) + { + case BINOP_IMPL : o << " ==> "; + break; + case BINOP_AND : o << " & "; + break; + case BINOP_OR : o << " | "; + } + right->print(o); + } + + o << ")" << flush; +} + +boolean BinOp::equals(PropFormula *formula) +{ + if (formula->isBinOp() == false) + return false; + BinOp *v = formula->asBinOp(); + return left->equals(v->left) && right->equals(v->right); +} + +void ConstFormula::print(ostream& o) +{ + o << (val ? "true" : "false") << flush; +} + +boolean ConstFormula::equals(PropFormula *formula) +{ + if (formula->isConst() == false) + return false; + ConstFormula *v = formula->asConst(); + return (v->value() == value()); +} + +void QuantFormula::print(ostream & o) +{ + switch (type) + { + case QUANT_FORALL: + o << "FORALL"; break; + case QUANT_EXISTS: + o << "EXISTS"; break; + default: + o << "?QUANT"; + } + o << "{"; + variable->print(o); + + PropFormula *f = formula; + + while (f->isQuant() && (f->asQuant()->getType() == this->getType())) + { + o << ", "; + f->asQuant()->getVariable()->print(o); + f = f->asQuant()->getFormula(); + } + + o << "}"; + f->print(o); + o << flush; +} + +boolean QuantFormula::equals(PropFormula *form) +{ + if (form->isQuant() == false) + return false; + if (form->asQuant()->getType() != getType()) + return false; + if (!form->asQuant()->getVariable()->equals(variable)) + return false; + if (!form->asQuant()->getFormula()->equals(formula)) + return false; + + return true; +} + +PropFormula * QuantFormula::instantiate(Var *sub) +{ + instantForm = formula->replace(variable, sub); + return instantForm; +} + +PropFormula * QuantFormula::replace(Var *v, Var *r) +{ + if (!this->variable->equals(v)) + { + /* handle quantifier capture -- shouldn't happen if we're well-formed */ + + + PropFormula *result = new QuantFormula(this->type, this->variable->formCopy()->asVar(), + formula->replace(v, r)); + + result->setParent(this); + + return result; + } + else return this->formCopy(); +} + diff --git a/src/formula.h b/src/formula.h new file mode 100644 index 0000000..779f982 --- /dev/null +++ b/src/formula.h @@ -0,0 +1,320 @@ +// $Id: formula.h,v 1.4 2000/01/25 03:05:43 david Exp $ + +// formula.h +// +// classes defining propositional formulas + +#ifndef _FORMULA_H +#define _FORMULA_H + +#include +#include +#include +#include "Vector.h" +#include "Markable.h" + +using namespace std; + +#ifndef boolean +#define boolean int +#define true 1 +#define false 0 +#endif /* !def _boolean */ + +// enumerated type for binary operators +typedef enum { + BINOP_AND, + BINOP_OR, + BINOP_IMPL } BooleanOperator; + +typedef enum { + QUANT_FORALL, + QUANT_EXISTS } QuantifierType; + +class Var; +class Not; +class BinOp; +class ConstFormula; +class QuantFormula; + +// supertype for propositional formulas, along with overridable +// type-determining functions. Markable superclass lets us hide irrelevant formulas +class PropFormula : public Markable +{ +private: + boolean tag; + PropFormula *_parent; +public: + // the following are pseudo-casts + virtual boolean isVar() { return false; } // overridden by Var + virtual Var *asVar() { return NULL; } + + virtual boolean isNot() { return false; } // overridden by Not + virtual Not *asNot() { return NULL; } + + virtual boolean isBinOp() { return false; } // overridden by BinOp + virtual BinOp *asBinOp() { return NULL; } + + virtual boolean isConst() { return false; } // overridden by ConstFormula + virtual ConstFormula *asConst() { return NULL; } + + virtual boolean isQuant() { return false; } + virtual QuantFormula *asQuant() { return NULL; } + + // printing routines + virtual void print(ostream&) = 0; + void println(ostream&); + + // equivalence testing routine + virtual boolean equals(PropFormula *) = 0; + + // copy formula + virtual PropFormula * formCopy() = 0; + + // instantiating quantified formulas requires... + virtual PropFormula * replace(Var * /* current */, Var * /* replacement */) = 0; + + // tag manipulation + void setTag() { tag = true; } + boolean tagged() { return tag; } + + // parent formula + void setParent(PropFormula *p) { _parent = p; } + PropFormula* getParent() { return _parent; } + + PropFormula() : Markable(0) { tag = false; _parent = NULL; } + +}; + +class Pred; + +// a formula consisting entirely of a single variable +class Var : virtual public PropFormula +{ + char *name; +public: + Var(const char *n) { name = strdup(n); } + + virtual void print(ostream&); + + virtual boolean equals(PropFormula *); + + // override the right pseudo-casts + Var *asVar() { return this; } + boolean isVar() { return true; } + + virtual boolean isPred() { return false; } + virtual Pred *asPred() { return NULL; } + + // accessor for variable name + char *varName() { return name; } + + virtual PropFormula * formCopy() + { + PropFormula *result = new Var(name); + + // set parent + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + virtual PropFormula * replace(Var *, Var *); +}; + +class Pred : virtual public Var +{ + Vector params; +public: + Pred(char *n, Vector p) : Var(n) { params = copy(p); } + + virtual void print(ostream &); + virtual boolean equals(PropFormula *); + + boolean isPred() { return true; } + Pred *asPred() { return this; } + + Vector &getParams() { return params; } + + PropFormula * formCopy () + { + PropFormula *result = new Pred(this->varName(), copy(params)); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + PropFormula * replace(Var *, Var *); + +}; + +// a formula consisting of the negation of another formula +class Not : virtual public PropFormula +{ + PropFormula *operand; +public: + Not(PropFormula *opnd) { operand = opnd; } + void print(ostream&); + boolean equals(PropFormula *); + + // override the appropriate pseudo-casts + Not *asNot() { return this; } + boolean isNot() { return true; } + + // accessor for operand of 'not' operator + PropFormula *notOperand() { return operand; } + + PropFormula * formCopy () + { + PropFormula *result = new Not(operand->formCopy()); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + PropFormula * replace(Var *v, Var *r) + { + PropFormula *result = new Not(operand->replace(v, r)); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } +}; + +// a formula encoding a binary operation on two subformulas +class BinOp : virtual public PropFormula +{ + PropFormula *left, *right; + BooleanOperator opr; +public: + BinOp(BooleanOperator o, PropFormula *l, PropFormula *r) + { + left = l; + right = r; + opr = o; + } + + boolean isBinOp() { return true; } + BinOp *asBinOp() { return this; } + + void print(ostream&); + + boolean equals(PropFormula *); + + PropFormula *leftOperand() { return left; } + PropFormula *rightOperand() { return right; } + + BooleanOperator op() { return opr; } + + PropFormula * formCopy () + { + PropFormula *result = new BinOp(opr, left->formCopy(), right->formCopy()); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + PropFormula * replace(Var *v, Var *r) + { + PropFormula *lf = left->replace(v, r), + *rf = right->replace(v, r), + *result = new BinOp(opr, lf, rf); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } +}; + +class ConstFormula : virtual public PropFormula +{ + boolean val; +public: + ConstFormula(boolean v) + { + val = v; + } + + boolean value() { return val; } + + boolean isConst() { return true; } + ConstFormula *asConst() { return this; } + + void print(ostream&); + + boolean equals(PropFormula *); + + PropFormula * formCopy () + { + PropFormula *result = new ConstFormula(val); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + PropFormula * replace(Var *, Var *) { return this->formCopy(); } +}; + + +class QuantFormula : virtual public PropFormula +{ + QuantifierType type; + Var *variable; + PropFormula *formula; + unsigned nextP; + + PropFormula *instantForm; // keep track of instantiated formula +public: + QuantFormula(QuantifierType t, Var *v, PropFormula *f, unsigned nP = 0) + { + type = t; + variable = v; + formula = f; + nextP = nP; + instantForm = NULL; + } + + boolean isQuant() { return true; } + QuantFormula *asQuant() { return this; } + + void print(ostream&); + boolean equals(PropFormula *); + + QuantifierType getType() { return type; } + Var *getVariable() { return variable; } + PropFormula *getFormula() { return formula; } + + unsigned nextParam() { return nextP; } + void incParam() { nextP++; } + void decParam() { nextP--; } + PropFormula *instantiate(Var *); + + PropFormula *instantFormula() { return instantForm; } + + PropFormula * formCopy () + { + PropFormula *result = new QuantFormula(type, variable->formCopy()->asVar(), formula->formCopy(), nextP); + + result->setParent(this); + if (tagged()) result->setTag(); + + return result; + } + + PropFormula * replace(Var *, Var *); +}; + +#endif /* !_FORMULA_H */ + diff --git a/src/lex.cc b/src/lex.cc new file mode 100644 index 0000000..e3fe865 --- /dev/null +++ b/src/lex.cc @@ -0,0 +1,165 @@ +// $Id: lex.cc,v 1.3 2000/01/24 17:42:52 david Exp $ + +// lex.cc +// by David Baer +// +// Lexical analyzer -- helps to parse formulas + +#include +#include +#include +#include +//#include +#include "lex.h" + +using namespace std; + +char *token_id_name = NULL; +istream *input; + +void setInput(istream& i) +{ + input = &i; +} + +// private class, local to this file +class LexBuffer +{ + char buf[256]; + int pos, end, str; +public: + LexBuffer() { pos = 0; end = -1; str = 0; do advance(); while (!strlen(buf)); } + LexBuffer(char *string) { strlcpy(buf, string, 256); pos = 0; end = strlen(string); str = 1; } + void advance() { + //cout << "buffer.advance" << endl; + if (!str && (pos > end)) + { + //cout << "buffer.advance read" << endl; + input->getline(buf, 255); + //cout << "got line: \"" << buf << "\"" << endl; + pos = 0; + end = input->gcount(); + } + else if (pos <= end) pos++; + //cout << "buffer.advance done: pos = " << pos << ", end = " << end << endl; + } + char current() { + if (pos >= end) return '\0'; + //cout << "buffer.current = " << buf[pos] << endl; + return buf[pos]; + } +} *buffer; + +void setInput(char *str) +{ + buffer = new LexBuffer(str); +} + +void illChar(char ch) +{ + cerr << "Illegal character ('" << ch << "') in input!" << endl; + exit(0); +} + +void killStr() +{ + delete token_id_name; +} + +int yylex(void) +{ + if (!buffer) buffer = new LexBuffer(); + char ch, idBuf[500]; + + // eat whitespace + while ((ch = buffer->current()) == ' ') buffer->advance(); + + switch (ch) + { + case '\r': buffer->advance(); + case '\n': buffer->advance(); + case '\0': /* cout << "end: " << (int)ch << endl; */ return -1; + case ',' : buffer->advance(); return TOKEN_COMMA; + case '{' : buffer->advance(); return TOKEN_LBRACE; + case '}' : buffer->advance(); return TOKEN_RBRACE; + case '(' : buffer->advance(); return TOKEN_LPAREN; + case ')' : buffer->advance(); return TOKEN_RPAREN; + case '&' : buffer->advance(); return TOKEN_AND; + case '|' : buffer->advance(); return TOKEN_OR; + case '=' : while (buffer->current() != '>') + { + if (buffer->current() != '=') + { + illChar(buffer->current()); + } + buffer->advance(); + } + buffer->advance(); // eat final > + return TOKEN_IMPL; + case '<' : buffer->advance(); + + while (buffer->current() != '>') + { + if (buffer->current() != '=') + illChar(buffer->current()); + buffer->advance(); + } + buffer->advance(); // eat final > + return TOKEN_IFF; + case '~' : buffer->advance(); return TOKEN_NOT; + default : if (!isalpha(ch)) + illChar(buffer->current()); + idBuf[0] = ch; + int index = 1; + buffer->advance(); + while (isalpha(ch = buffer->current())) + { + idBuf[index++] = ch; + buffer->advance(); + } + idBuf[index] = '\0'; + if (token_id_name) delete token_id_name; + token_id_name = strdup(idBuf); + if (!strcasecmp(token_id_name, "FORALL")) return TOKEN_FORALL; + else if (!strcasecmp(token_id_name, "EXISTS")) return TOKEN_EXISTS; + else return TOKEN_ID; + } + +} + +void flushInput() { +// char line[100]; +// input.getline(line, 98); + if (buffer) + { + delete buffer; + buffer = NULL; + } + +} + +static +const char *token_name[] = +{ + "TOKEN_COMMA", + "TOKEN_FORALL", + "TOKEN_EXISTS", + "TOKEN_LBRACE", + "TOKEN_RBRACE", + "TOKEN_LPAREN", + "TOKEN_RPAREN", + "TOKEN_AND", + "TOKEN_OR", + "TOKEN_IMPL", + "TOKEN_NOT", + "TOKEN_ID" +}; + +void printToken(Token t) +{ + if ((t >= TOKEN_COMMA) && (t <= TOKEN_ID)) + cout << token_name[(int)t]; + else cout << "(UNKNOWN TOKEN)"; +} + + diff --git a/src/lex.h b/src/lex.h new file mode 100644 index 0000000..72d82e0 --- /dev/null +++ b/src/lex.h @@ -0,0 +1,36 @@ +// $Id: lex.h,v 1.3 2000/01/24 17:42:52 david Exp $ + +// lex.h -- contains token types +#ifndef _LEX_H +#define _LEX_H + +#include +using std::istream; + +typedef enum { + TOKEN_ERR = -1, + TOKEN_COMMA = 0, + TOKEN_FORALL, + TOKEN_EXISTS, + TOKEN_LBRACE, + TOKEN_RBRACE, + TOKEN_LPAREN, + TOKEN_RPAREN, + TOKEN_AND, + TOKEN_OR, + TOKEN_IMPL, + TOKEN_IFF, + TOKEN_NOT, + TOKEN_ID } Token; + +#define restart setInput + +extern char *token_id_name; +extern void setInput(istream&); +extern void setInput(char*); +extern int yylex(void); +extern void flushInput(); +extern void printToken(Token); + +#endif /* !_LEX_H */ + diff --git a/src/lionheart b/src/lionheart new file mode 100755 index 0000000000000000000000000000000000000000..726e957e3c4135bc963ce437d4e8101fcb4c043b GIT binary patch literal 745290 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 @pOd)38w5gFR)N&^O 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

+(W*IytD+3~7vvSu%R{gzv(U_t5GVIBzD{T< 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

nis(LTgRPrmk< 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

$VX_x0{{jLgbs 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

5Sa)R6M>+G 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

l*OzaXB3 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 EAFPDFh5!Hn literal 0 HcmV?d00001 diff --git a/src/main.cc b/src/main.cc new file mode 100644 index 0000000..873a923 --- /dev/null +++ b/src/main.cc @@ -0,0 +1,89 @@ +// $Id: main.cc,v 1.5 2000/01/30 00:59:32 david Exp $ + +// main.cc +// by David Baer +// +// Main module -- read formula and attempt a proof, then save if desired + +#include +#include +#include +#include +//#include +#include +#include "formula.h" +#include "Proof.h" +#include "parser.h" +#include "Options.h" +#include "Axiom.h" +#include "ParamSource.h" + +using namespace std; + +int main(int argc, char *argv[]) +{ + PropFormula *form; + char filename[200]; + Options opt(argc, argv); + + if (opt.help()) + { + opt.syntax(); + exit(0); + } + + form = opt.getFormula(); + + if (!form) + { + cout << "Formula to be proved: " << flush; + + initParser(cin); + form = parseFormula(); + endParser(); + } + + if (!form) + { + cout << "not a valid formula" << endl; + exit(0); + } + + psource.setMax(opt.maxParam()); + + //form->println(cout); + RuleSource *guide; + guide = (opt.manual() ? new UserRuleSource(cin, cout) : new AutoRuleSource(cin, cout, opt.quiet(), opt.pause(), opt.induction())); + Proof *pf = (opt.manual() ? new Proof(form, guide) : new Proof(axioms.getVector(), form, guide)); + //Proof *pf = new Proof(form); + if (pf->prove() == PROOF_TRUE) + { + if (!opt.quiet()) cout << "Theorem is a tautology" << endl; + //cin >> filename; + //cin.getline(filename, 198); // don't ask me why I have to do this... + if (!opt.dump()) + { + if (opt.outputFile()) + { + if (!opt.quiet()) cout << "Saving proof to " << opt.outputFile() << endl; + strlcpy(filename, opt.outputFile(), 200); + } + else + { + cout << "Save proof to : " << flush; + cin.getline(filename, 198); + } + if (strlen(filename)) + { + ofstream o(filename); + pf->print(o); + } + } + else pf->print(cout); + } + else cout << "Did not find a proof " << endl; + + //pf->cleanup(); + delete pf; + return 0; +} diff --git a/src/parser.cc b/src/parser.cc new file mode 100644 index 0000000..b384a9d --- /dev/null +++ b/src/parser.cc @@ -0,0 +1,263 @@ +// $Id: parser.cc,v 1.4 2000/01/25 03:05:43 david Exp $ + +// parser.cc +// by David Baer +// +// Convert text into a formula object + +#include +#include +#include +#include "lex.h" +#include "formula.h" +#include "Proof.h" +//#include "RuleSource.h" + +Token current = (Token)-1; + +inline void advance() { current = (Token)yylex(); } +inline void setup() { +// while ((current = (Token)yylex()) == -1); // eat CRLF's + while (current == -1 ) advance(); +} + +PropFormula *parseTerm(); +PropFormula *parseAnd(); +PropFormula *parseOr(); +PropFormula *parseFormula(); + +PropFormula *build(PropFormula *left, Token op) +{ + //cout << "build" << endl; + Token curOp = op; + PropFormula *result = left; + + while (curOp == op) + { + advance(); // eat operator + switch(op) + { + case TOKEN_IFF : result = new BinOp(BINOP_IMPL, result, parseOr()); + result = new BinOp(BINOP_AND, result, new BinOp(BINOP_IMPL, result->asBinOp()->rightOperand()->formCopy(), result->asBinOp()->leftOperand()->formCopy())); + break; + case TOKEN_IMPL : result = new BinOp(BINOP_IMPL, result, parseOr()); + break; + case TOKEN_OR : result = new BinOp(BINOP_OR, result, parseAnd()); + break; + case TOKEN_AND : result = new BinOp(BINOP_AND, result, parseTerm()); + break; + default : ; + } + curOp = current; + } + //cout << "done build" << endl; + return result; +} + +static inline +Vector getVarList() +{ + Vector result; + + //cout << "Variables in list: "; + while (current == TOKEN_ID) + { + result.addElement(new Var(token_id_name)); + //cout << token_id_name; + advance(); + + if (current == TOKEN_COMMA) + { + advance(); + //cout << ", "; + } + //else cout << endl; + + } + + return result; +} + +static inline +Var *handleId() +// pre: current -> TOKEN_ID +{ + Var *result; + char *str = strdup(token_id_name); + + //cout << "handleId()" << endl; + + + advance(); + if (current == TOKEN_LPAREN) + { + Vector params; + + advance(); // eat ( + params = getVarList(); + if (current != TOKEN_RPAREN) + cerr << "expected ) to close predicate parameter list" << endl; + else advance(); // eat ) + + result = new Pred(str, params); + + } + else result = new Var(str); + + delete str; + + //cout << "handleId() result: "; + //result->println(cout); + return result; +} + +static inline +QuantFormula *handleQuant() +// pre: current -> TOKEN_{FORALL,EXISTS} +{ + QuantifierType type = (current == TOKEN_FORALL ? QUANT_FORALL : QUANT_EXISTS); + + //cout << "handleQuant()" << endl; + + advance(); + // expect a { here + if (current != TOKEN_LBRACE) + // complain bitterly + cerr << "expected a { after quantifier" << endl; + else advance(); + + Vector vars = getVarList(); + + if (current != TOKEN_RBRACE) + cerr << "expected a } to close quantified variables" << endl; + else advance(); // past } to quantified formula + + int i; + PropFormula *formula = parseTerm(); // read quantified formula + + //cout << "prepending " << vars.size() << "variables" << endl; + for (i = vars.size() - 1; i >= 0; i--) + formula = new QuantFormula(type, vars(i), formula); + + //cout << "duh.." << endl; + + vars.kill(); + + //cout << "handleQuant() result: "; + //formula->println(cout); + return formula->asQuant(); +} + +PropFormula *parseTerm() +{ + //cout << "parseTerm()" << endl; + PropFormula *result; + + switch(current) + { + case -1 : cerr << "Premature end of file!" << endl; + return NULL; + case TOKEN_NOT : advance(); // eat ~ + result = new Not(parseTerm()); + break; + case TOKEN_LPAREN : advance(); // eat ( + result = parseFormula(); + if (current != TOKEN_RPAREN) + cerr << "missing right paren!" << endl; + else advance(); // eat ) + break; + case TOKEN_ID : result = handleId(); break; + case TOKEN_FORALL: + case TOKEN_EXISTS: result = handleQuant(); break; + default : return NULL; + } + + //cout << "parseTerm() result: "; + //result->println(cout); + return result; + +} + +PropFormula *parseAnd() +{ + //cout << "parseAnd" << endl; + PropFormula *result; + + switch(current) + { + case -1 : cerr << "Premature end of input!" << endl; + return NULL; + case TOKEN_NOT : + case TOKEN_LPAREN : + case TOKEN_FORALL: + case TOKEN_EXISTS: + case TOKEN_ID : result = parseTerm(); + if (current == TOKEN_AND) + return build(result, TOKEN_AND); + else return result; + default : return NULL; + } +} + +PropFormula *parseOr() +{ + //cout << "parseOr" << endl; + PropFormula *result; + + switch(current) + { + case -1 : cerr << "Premature end of input!" << endl; + return NULL; + case TOKEN_NOT : + case TOKEN_LPAREN : + case TOKEN_FORALL: + case TOKEN_EXISTS: + case TOKEN_ID : result = parseAnd(); + if (current == TOKEN_OR) + return build(result, TOKEN_OR); + else return result; + default : return NULL; + } +} + +PropFormula *parseFormula() +{ + //cout << "parseFormula" << endl; + PropFormula *result; + + switch (current) + { + case -1 : cerr << "Premature end of input!" << endl; + return NULL; + case TOKEN_NOT : + case TOKEN_LPAREN : + case TOKEN_FORALL: + case TOKEN_EXISTS: + case TOKEN_ID : // implication level + result = parseOr(); + if ((current == TOKEN_IMPL) || (current == TOKEN_IFF)) + return build(result, current); + else return result; + default : return NULL; + } +} + +void initParser(istream& i) +{ + //cout << "initParser" << endl; + restart(i); + //cout << "setup" << endl; + setup(); + //cout << "done setup" << endl; +} + +void initParser(char *str) +{ + restart(str); + setup(); +} + +void endParser() +{ + flushInput(); +} diff --git a/src/parser.h b/src/parser.h new file mode 100644 index 0000000..b7d8110 --- /dev/null +++ b/src/parser.h @@ -0,0 +1,20 @@ +// $Id: parser.h,v 1.3 2000/01/24 17:42:52 david Exp $ + +// parser.h +// by David Baer +// +// Headers for the parser + +#ifndef _PARSER_H +#define _PARSER_H + +#include +#include "formula.h" + +extern void initParser(istream&); +extern void initParser(char*); +extern PropFormula *parseFormula(); +extern void endParser(); + +#endif /* !_PARSER_H */ + diff --git a/src/predtest.cc b/src/predtest.cc new file mode 100644 index 0000000..2be3e32 --- /dev/null +++ b/src/predtest.cc @@ -0,0 +1,50 @@ +// $Id: predtest.cc,v 1.2 1999/11/17 01:47:34 david Exp $ + +// predtest.cc +// by David Baer +// +// Silly little test of predicates + +#include +#include +#include "formula.h" +#include "Vector.h" + +int main() +{ + char c; + Vector params; + + for (c = 'w'; c <= 'z'; c++) + { + char str[55] = "\0\0"; + //snprintf(str, 55, "%c", c); + str[0] = c; + params.addElement(new Var(str)); + } + Pred *test = new Pred("P", params), *test2 = new Pred("Q", params); + + cout << "Preds:" << endl; + test->println(cout); + test2->println(cout); + + test->print(cout); + if (test->equals(test2)) cout << "="; + else cout << "!="; + test2->print(cout); + cout << endl; + + QuantFormula *test3 = new QuantFormula(QUANT_FORALL, new Var("w"), + new QuantFormula(QUANT_FORALL, new Var("x"), + new QuantFormula(QUANT_FORALL, new Var("y"), + new QuantFormula(QUANT_FORALL, new Var("z"), + test)))); + + test3->println(cout); + + PropFormula *test4 = test3->instantiate(new Var("w0")); + + test4->println(cout); + + return 0; +}

{NubKG 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