biblicit 1.0 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitmodules +3 -0
- data/Gemfile +1 -1
- data/README.md +125 -30
- data/Rakefile +22 -0
- data/biblicit.gemspec +9 -7
- data/lib/biblicit/cb2bib.rb +10 -11
- data/lib/biblicit/citeseer.rb +14 -26
- data/lib/biblicit/extractor.rb +40 -19
- data/lib/biblicit/parscit.rb +38 -0
- data/parscit/.gitignore +8 -0
- data/parscit/CHANGELOG +125 -0
- data/parscit/COPYING +674 -0
- data/parscit/COPYING.LESSER +165 -0
- data/parscit/INSTALL +105 -0
- data/parscit/README +97 -0
- data/{perl/ParsCit/README.TXT → parscit/USAGE} +25 -15
- data/parscit/bin/archtest.pl +31 -0
- data/parscit/bin/citeExtract.pl +562 -0
- data/parscit/bin/conlleval.pl +315 -0
- data/parscit/bin/headExtract.pl +40 -0
- data/parscit/bin/parsHed/convert2TokenLevel.pl +138 -0
- data/parscit/bin/parsHed/keywordGen.pl +308 -0
- data/parscit/bin/parsHed/parseXmlHeader.pl +141 -0
- data/parscit/bin/parsHed/redo.parsHed.pl +198 -0
- data/parscit/bin/parsHed/tr2crfpp_parsHed.pl +521 -0
- data/parscit/bin/parseRefStrings.pl +102 -0
- data/parscit/bin/phOutput2xml.pl +223 -0
- data/parscit/bin/redo.parsCit.pl +105 -0
- data/parscit/bin/sectExtract.pl +149 -0
- data/parscit/bin/sectLabel/README +110 -0
- data/parscit/bin/sectLabel/README.txt +110 -0
- data/parscit/bin/sectLabel/genericSect/crossValidation.rb +98 -0
- data/parscit/bin/sectLabel/genericSect/extractFeature.rb +104 -0
- data/parscit/bin/sectLabel/genericSectExtract.rb +53 -0
- data/parscit/bin/sectLabel/getStructureInfo.pl +156 -0
- data/parscit/bin/sectLabel/processOmniXML.pl +1427 -0
- data/parscit/bin/sectLabel/processOmniXML_new.pl +1025 -0
- data/parscit/bin/sectLabel/processOmniXMLv2.pl +1529 -0
- data/parscit/bin/sectLabel/processOmniXMLv3.pl +964 -0
- data/parscit/bin/sectLabel/redo.sectLabel.pl +219 -0
- data/parscit/bin/sectLabel/simplifyOmniXML.pl +382 -0
- data/parscit/bin/sectLabel/single2multi.pl +190 -0
- data/parscit/bin/sectLabel/tr2crfpp.pl +158 -0
- data/parscit/bin/tr2crfpp.pl +260 -0
- data/parscit/bin/xml2train.pl +193 -0
- data/parscit/lib/CSXUtil/SafeText.pm +130 -0
- data/parscit/lib/Omni/Config.pm +93 -0
- data/parscit/lib/Omni/Omnicell.pm +263 -0
- data/parscit/lib/Omni/Omnicol.pm +292 -0
- data/parscit/lib/Omni/Omnidd.pm +328 -0
- data/parscit/lib/Omni/Omnidoc.pm +153 -0
- data/parscit/lib/Omni/Omniframe.pm +223 -0
- data/parscit/lib/Omni/Omniline.pm +423 -0
- data/parscit/lib/Omni/Omnipage.pm +282 -0
- data/parscit/lib/Omni/Omnipara.pm +232 -0
- data/parscit/lib/Omni/Omnirun.pm +303 -0
- data/parscit/lib/Omni/Omnitable.pm +336 -0
- data/parscit/lib/Omni/Omniword.pm +162 -0
- data/parscit/lib/Omni/Traversal.pm +313 -0
- data/parscit/lib/ParsCit/.PostProcess.pm.swp +0 -0
- data/parscit/lib/ParsCit/Citation.pm +737 -0
- data/parscit/lib/ParsCit/CitationContext.pm +220 -0
- data/parscit/lib/ParsCit/Config.pm +35 -0
- data/parscit/lib/ParsCit/Controller.pm +653 -0
- data/parscit/lib/ParsCit/PostProcess.pm +505 -0
- data/parscit/lib/ParsCit/PreProcess.pm +1041 -0
- data/parscit/lib/ParsCit/Tr2crfpp.pm +1195 -0
- data/parscit/lib/ParsHed/Config.pm +49 -0
- data/parscit/lib/ParsHed/Controller.pm +143 -0
- data/parscit/lib/ParsHed/PostProcess.pm +322 -0
- data/parscit/lib/ParsHed/Tr2crfpp.pm +448 -0
- data/{perl/ParsCit/lib/ParsCit/Tr2crfpp.pm → parscit/lib/ParsHed/Tr2crfpp_token.pm} +22 -21
- data/parscit/lib/SectLabel/AAMatching.pm +1949 -0
- data/parscit/lib/SectLabel/Config.pm +88 -0
- data/parscit/lib/SectLabel/Controller.pm +332 -0
- data/parscit/lib/SectLabel/PostProcess.pm +425 -0
- data/parscit/lib/SectLabel/PreProcess.pm +116 -0
- data/parscit/lib/SectLabel/Tr2crfpp.pm +1246 -0
- data/parscit/resources/parsCit.model +0 -0
- data/parscit/resources/parsCit.split.model +0 -0
- data/{perl/ParsCit → parscit}/resources/parsCitDict.txt +205 -0
- data/parscit/resources/parsHed/bigram +10 -0
- data/parscit/resources/parsHed/keywords +10 -0
- data/parscit/resources/parsHed/parsHed.model +0 -0
- data/parscit/resources/parsHed/parsHed.template +178 -0
- data/parscit/resources/sectLabel/affiliation.model +0 -0
- data/parscit/resources/sectLabel/author.model +0 -0
- data/parscit/resources/sectLabel/funcWord +320 -0
- data/parscit/resources/sectLabel/genericSect.model +0 -0
- data/parscit/resources/sectLabel/sectLabel.config +42 -0
- data/parscit/resources/sectLabel/sectLabel.configXml +42 -0
- data/parscit/resources/sectLabel/sectLabel.model +0 -0
- data/sh/convert_to_text.sh +20 -0
- data/spec/biblicit/extractor_spec.rb +121 -0
- data/spec/fixtures/Review_of_Michael_Tyes_Consciousness_Revisited.docx +0 -0
- data/spec/fixtures/critical-infrastructures.ps +63951 -0
- data/spec/fixtures/txt/E06-1050.txt +867 -0
- data/spec/fixtures/txt/sample1.txt +902 -0
- data/spec/fixtures/txt/sample2.txt +394 -0
- data/spec/spec_helper.rb +3 -0
- data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/Function.pm +2 -20
- data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/MultiClassChunking.pm +0 -7
- data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/Parser.pm +0 -2
- data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/ParserMethods.pm +0 -7
- data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/Config/API_Config.pm +6 -1
- data/svm-header-parse/HeaderParseService/tmp/.gitignore +4 -0
- data/svm-header-parse/extract.pl +75 -0
- metadata +351 -317
- data/perl/DocFilter/lib/DocFilter/Config.pm +0 -35
- data/perl/DocFilter/lib/DocFilter/Filter.pm +0 -51
- data/perl/FileConversionService/README.TXT +0 -11
- data/perl/FileConversionService/converters/PDFBox/pdfbox-app-1.7.1.jar +0 -0
- data/perl/FileConversionService/lib/CSXUtil/SafeText.pm +0 -140
- data/perl/FileConversionService/lib/FileConverter/CheckSum.pm +0 -77
- data/perl/FileConversionService/lib/FileConverter/Compression.pm +0 -137
- data/perl/FileConversionService/lib/FileConverter/Config.pm +0 -57
- data/perl/FileConversionService/lib/FileConverter/Controller.pm +0 -191
- data/perl/FileConversionService/lib/FileConverter/JODConverter.pm +0 -61
- data/perl/FileConversionService/lib/FileConverter/PDFBox.pm +0 -69
- data/perl/FileConversionService/lib/FileConverter/PSConverter.pm +0 -69
- data/perl/FileConversionService/lib/FileConverter/PSToText.pm +0 -88
- data/perl/FileConversionService/lib/FileConverter/Prescript.pm +0 -68
- data/perl/FileConversionService/lib/FileConverter/TET.pm +0 -75
- data/perl/FileConversionService/lib/FileConverter/Utils.pm +0 -130
- data/perl/HeaderParseService/lib/CSXUtil/SafeText.pm +0 -140
- data/perl/HeaderParseService/resources/data/EbizHeaders.txt +0 -24330
- data/perl/HeaderParseService/resources/data/EbizHeaders.txt.parsed +0 -27506
- data/perl/HeaderParseService/resources/data/EbizHeaders.txt.parsed.old +0 -26495
- data/perl/HeaderParseService/resources/data/tagged_headers.txt +0 -40668
- data/perl/HeaderParseService/resources/data/test_header.txt +0 -31
- data/perl/HeaderParseService/resources/data/test_header.txt.parsed +0 -31
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test1 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test10 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test11 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test12 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test13 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test14 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test15 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test2 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test3 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test4 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test5 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test6 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test7 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test8 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_1156237246.08016_test9 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test1 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test10 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test11 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test12 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test13 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test14 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test15 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test2 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test3 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test4 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test5 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test6 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test7 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test8 +0 -23
- data/perl/HeaderParseService/tmp/tmpVec_914027525.276114_test9 +0 -23
- data/perl/ParsCit/crfpp/traindata/parsCit.template +0 -60
- data/perl/ParsCit/crfpp/traindata/parsCit.train.data +0 -12104
- data/perl/ParsCit/crfpp/traindata/tagged_references.txt +0 -500
- data/perl/ParsCit/lib/CSXUtil/SafeText.pm +0 -140
- data/perl/ParsCit/lib/ParsCit/Citation.pm +0 -462
- data/perl/ParsCit/lib/ParsCit/CitationContext.pm +0 -132
- data/perl/ParsCit/lib/ParsCit/Config.pm +0 -46
- data/perl/ParsCit/lib/ParsCit/Controller.pm +0 -306
- data/perl/ParsCit/lib/ParsCit/PostProcess.pm +0 -367
- data/perl/ParsCit/lib/ParsCit/PreProcess.pm +0 -333
- data/perl/ParsCit/resources/parsCit.model +0 -0
- data/perl/extract.pl +0 -199
- data/spec/biblicit/cb2bib_spec.rb +0 -48
- data/spec/biblicit/citeseer_spec.rb +0 -40
- /data/{perl → svm-header-parse}/HeaderParseService/README.TXT +0 -0
- /data/{perl/DocFilter → svm-header-parse/HeaderParseService}/lib/CSXUtil/SafeText.pm +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/AssembleXMLMetadata.pm +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/LoadInformation.pm +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/lib/HeaderParse/API/NamePatternMatch.pm +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/50states +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/AddrTopWords.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/AffiTopWords.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/AffiTopWordsAll.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/ChineseSurNames.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/Csurnames.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/Csurnames_spec.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/DomainSuffixes.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/LabeledHeader +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/README +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/TrainMulClassLines +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/TrainMulClassLines1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/abstract.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/abstractTopWords +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/addr.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/affi.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/affis.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/all_namewords_spec.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/allnamewords.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/cities_US.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/cities_world.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/city.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/cityname.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/country_abbr.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/countryname.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/dateTopWords +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/degree.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/email.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/excludeWords.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/female-names +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/firstNames.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/firstnames.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/firstnames_spec.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/intro.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/keyword.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/keywordTopWords +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/male-names +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/middleNames.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/month.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mul +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mul.label +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mul.label.old +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mul.processed +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mulAuthor +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/mulClassStat +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/nickname.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/nicknames.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/note.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/page.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/phone.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/postcode.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/pubnum.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/statename.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/statename.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/states_and_abbreviations.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/stopwords +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/stopwords.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/surNames.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/surnames.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/surnames_spec.bin +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/A.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/B.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/C.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/D.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/E.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/F.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/G.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/H.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/I.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/J.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/K.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/L.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/M.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/N.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/O.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/P.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/Q.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/R.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/S.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/T.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/U.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/V.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/W.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/WCSelect.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/X.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/Y.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/Z.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ae.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/am.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ar.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/at.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/au.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/bd.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/be.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/bg.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/bh.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/blueribbon.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/bm.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/bn.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/br.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ca.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ch.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/cl.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/cn.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/co.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/cr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/cy.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/cz.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/de.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/dean-mainlink.jpg +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/dk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ec.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ee.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/eg.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/es.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/et.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/faq.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/fi.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/fj.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/fo.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/fr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/geog.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/gr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/gu.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/hk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/hr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/hu.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/id.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ie.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/il.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/in.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/is.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/it.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/jm.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/jo.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/jp.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/kaplan.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/kr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/kw.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/lb.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/linkbw2.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/lk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/lt.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/lu.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/lv.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ma.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/maczynski.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mirror.tar +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mo.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mseawdm.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mt.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/mx.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/my.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ni.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/nl.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/no.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/nz.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pa.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pe.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ph.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pl.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pointcom.gif +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ps.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/pt.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/recognition.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/results.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ro.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ru.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/sd.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/se.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/sg.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/si.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/sk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/th.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/tr.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/tw.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ua.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/uk.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/univ-full.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/univ.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/uy.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/ve.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/yu.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/za.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list/zm.html +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/university_list.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/url.txt +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/webTopWords +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/database/words +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/10ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/10Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/11ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/11Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/12ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/12Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/13ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/13Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/14ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/14Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/15ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/15Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/1ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/1Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/2ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/2Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/3ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/3Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/4ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/4Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/5ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/5Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/6ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/6Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/7ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/7Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/8ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/8Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/9ContextModelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/9Modelfold1 +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/NameSpaceModel +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/NameSpaceTrainF +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/WrapperBaseFeaDict +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/WrapperContextFeaDict +0 -0
- /data/{perl → svm-header-parse}/HeaderParseService/resources/models/WrapperSpaceAuthorFeaDict +0 -0
|
@@ -0,0 +1,902 @@
|
|
|
1
|
+
A Calculus of Program Transformations and Its
|
|
2
|
+
Applications
|
|
3
|
+
|
|
4
|
+
Rahma Ben Ayed
|
|
5
|
+
School of Engineering
|
|
6
|
+
University of Tunis II
|
|
7
|
+
Belvedere, 1002 Tunisia
|
|
8
|
+
rbenayed@stardent.cck.tn
|
|
9
|
+
Jules Desharnais
|
|
10
|
+
Department of Informatics
|
|
11
|
+
Laval University,
|
|
12
|
+
Quebec City, PQ G1K 7P4, Canada
|
|
13
|
+
Jules.Desharnais@ift.ulaval.ca
|
|
14
|
+
Marc Frappier
|
|
15
|
+
Dept of Maths and Informatics
|
|
16
|
+
University of Sherbrooke
|
|
17
|
+
Sherbrooke, PQ J1K 2R1 Canada
|
|
18
|
+
marc.frappier@dmi.usherb.ca
|
|
19
|
+
Ali Mili
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
The Institute for Software Research
|
|
24
|
+
1000 Technology Drive
|
|
25
|
+
Fairmont, WV 26554 USA
|
|
26
|
+
amili@csee.wvu.edu
|
|
27
|
+
May 27, 1998
|
|
28
|
+
Abstract
|
|
29
|
+
|
|
30
|
+
Traditional programming calculi focus on transforming a specification into a program.
|
|
31
|
+
With the advent of such recent paradigms as white box reuse, component based software
|
|
32
|
+
development, and reengineering, and with the continued predominance of software maintenance,
|
|
33
|
+
less and less software engineering activity nowadays deals with straightforward
|
|
34
|
+
development. More and more, software products are derived by combining, merging, or
|
|
35
|
+
adapting existing components. In this paper we present a calculus that models several
|
|
36
|
+
aspects of these paradigms.
|
|
37
|
+
|
|
38
|
+
Keywords: Formal specifications, Programming calculi, Program construction, Software
|
|
39
|
+
merging, Software incrementation, Software adaptation.
|
|
40
|
+
1 Relational Specifications
|
|
41
|
+
|
|
42
|
+
We represent specifications by relations; without much loss of generality, we consider
|
|
43
|
+
homogeneous relations, and we denote by S the space on which relations are defined. As a
|
|
44
|
+
specification, a relation contains all the (input, output) pairs that are considered correct.
|
|
45
|
+
We have discussed in [6] how to use (heterogeneous) relations to represent specifications of
|
|
46
|
+
objects, in the sense of object oriented programming. Hence even though the discussions
|
|
47
|
+
of this paper deal with specifications of simple input/output functions, they can in fact
|
|
48
|
+
be applied to state-bearing modules, such as objects.
|
|
49
|
+
Constant relations include the universal relation, denoted by L, the identity relation,
|
|
50
|
+
denoted by I , and the empty relation, denoted by ;. Operations on relations include the
|
|
51
|
+
|
|
52
|
+
complement, denoted by R, the inverse, denoted by
|
|
53
|
+
|
|
54
|
+
b
|
|
55
|
+
|
|
56
|
+
R, and the product, denoted by R ffi R
|
|
57
|
+
|
|
58
|
+
0
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
Correspondence Author.
|
|
62
|
+
|
|
63
|
+
or RR
|
|
64
|
+
|
|
65
|
+
0
|
|
66
|
+
|
|
67
|
+
. We say that R is deterministic if and only if
|
|
68
|
+
|
|
69
|
+
b
|
|
70
|
+
|
|
71
|
+
RR ` I , and we say that R is total
|
|
72
|
+
|
|
73
|
+
if and only if I ` R
|
|
74
|
+
|
|
75
|
+
b
|
|
76
|
+
|
|
77
|
+
R.
|
|
78
|
+
|
|
79
|
+
We define an ordering relation on relational specifications under the name refinement
|
|
80
|
+
ordering: A relation R is said to refine a relation R
|
|
81
|
+
|
|
82
|
+
0
|
|
83
|
+
|
|
84
|
+
if and only if
|
|
85
|
+
|
|
86
|
+
RL " R
|
|
87
|
+
|
|
88
|
+
0
|
|
89
|
+
|
|
90
|
+
L " (R [ R
|
|
91
|
+
|
|
92
|
+
0
|
|
93
|
+
|
|
94
|
+
) = R
|
|
95
|
+
|
|
96
|
+
0
|
|
97
|
+
|
|
98
|
+
:
|
|
99
|
+
|
|
100
|
+
We then write R w R
|
|
101
|
+
|
|
102
|
+
0
|
|
103
|
+
|
|
104
|
+
or R
|
|
105
|
+
|
|
106
|
+
0
|
|
107
|
+
|
|
108
|
+
v R. We admit without proof that this relation is a partial
|
|
109
|
+
ordering. We also admit that, modulo some definition of total correctness, the following
|
|
110
|
+
propositions hold:
|
|
111
|
+
|
|
112
|
+
ffl A program P is correct with respect to a specification R if and only if [P ] w R,
|
|
113
|
+
|
|
114
|
+
where [P ] is the function defined by P .
|
|
115
|
+
|
|
116
|
+
ffl R w R
|
|
117
|
+
|
|
118
|
+
0
|
|
119
|
+
|
|
120
|
+
if and only if any program correct with respect to R is correct with respect
|
|
121
|
+
to R
|
|
122
|
+
|
|
123
|
+
0
|
|
124
|
+
|
|
125
|
+
.
|
|
126
|
+
The refinement ordering has some lattice-like properties which, for the sake of parsimony,
|
|
127
|
+
we present briefly without proof (details can be found in [2]).
|
|
128
|
+
|
|
129
|
+
ffl Two relations R and R
|
|
130
|
+
|
|
131
|
+
0
|
|
132
|
+
|
|
133
|
+
have a join (denoted by R t R
|
|
134
|
+
|
|
135
|
+
0
|
|
136
|
+
|
|
137
|
+
) if and only if they satisfy
|
|
138
|
+
the condition
|
|
139
|
+
|
|
140
|
+
RL " R
|
|
141
|
+
|
|
142
|
+
0
|
|
143
|
+
|
|
144
|
+
L = (R " R
|
|
145
|
+
|
|
146
|
+
0
|
|
147
|
+
|
|
148
|
+
)L:
|
|
149
|
+
Under this condition, the join is given by
|
|
150
|
+
|
|
151
|
+
R t R
|
|
152
|
+
|
|
153
|
+
0
|
|
154
|
+
|
|
155
|
+
= R " R
|
|
156
|
+
|
|
157
|
+
0
|
|
158
|
+
|
|
159
|
+
L [ R
|
|
160
|
+
|
|
161
|
+
0
|
|
162
|
+
|
|
163
|
+
" RL [ (R " R
|
|
164
|
+
|
|
165
|
+
0
|
|
166
|
+
|
|
167
|
+
):
|
|
168
|
+
The specification R t R
|
|
169
|
+
|
|
170
|
+
0
|
|
171
|
+
|
|
172
|
+
captures all the information of R and all the information
|
|
173
|
+
of R
|
|
174
|
+
|
|
175
|
+
0
|
|
176
|
+
|
|
177
|
+
. It is satisfied by any implementation that is known to satisfy both R and R
|
|
178
|
+
|
|
179
|
+
0
|
|
180
|
+
|
|
181
|
+
.
|
|
182
|
+
|
|
183
|
+
ffl Any two relations R and R
|
|
184
|
+
|
|
185
|
+
0
|
|
186
|
+
|
|
187
|
+
have a meet, which is denoted by RuR
|
|
188
|
+
|
|
189
|
+
0
|
|
190
|
+
|
|
191
|
+
and defined by
|
|
192
|
+
|
|
193
|
+
R u R
|
|
194
|
+
|
|
195
|
+
0
|
|
196
|
+
|
|
197
|
+
= RL " R
|
|
198
|
+
|
|
199
|
+
0
|
|
200
|
+
|
|
201
|
+
L " (R [ R
|
|
202
|
+
|
|
203
|
+
0
|
|
204
|
+
|
|
205
|
+
):
|
|
206
|
+
The specification RuR
|
|
207
|
+
|
|
208
|
+
0
|
|
209
|
+
|
|
210
|
+
captures the requirements information that R and R
|
|
211
|
+
|
|
212
|
+
0
|
|
213
|
+
|
|
214
|
+
have
|
|
215
|
+
in common. It is satisfied by any implementation that is known to satisfy either R
|
|
216
|
+
|
|
217
|
+
or R
|
|
218
|
+
|
|
219
|
+
0
|
|
220
|
+
|
|
221
|
+
.
|
|
222
|
+
The join operator can be used to structure complex specifications as aggregates of simpler
|
|
223
|
+
specifications; hence most of the manipulations we discuss in this paper can be made
|
|
224
|
+
arbitrarily simple by by considering arbitrarily simple component specifications.
|
|
225
|
+
2 A Calculus of Programming by Parts
|
|
226
|
+
|
|
227
|
+
Programming by parts rests on the premise that complex specifications can be structured
|
|
228
|
+
as joins of simpler specifications, and proceeds by solving each component of the join
|
|
229
|
+
in turn, then combining the partially defined solutions so obtained to produce a program
|
|
230
|
+
that satisfies all the component subspecifications simultaneously. To support this program
|
|
231
|
+
derivation method, we provide the following tools:
|
|
232
|
+
|
|
233
|
+
ffl A specification/programming notation that supports specification structuring (by
|
|
234
|
+
means of joins, meets) as well as program structuring (by means of traditional programming
|
|
235
|
+
constructs).
|
|
236
|
+
|
|
237
|
+
ffl A set of guidelines for deriving partially determined programs from component subspecifications.
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
ffl A set of rules for combining partially determined programs into (more) completely
|
|
241
|
+
determined programs.
|
|
242
|
+
Due to space restrictions, we can only present a flavor of this method; details of this
|
|
243
|
+
method can be found in [2].
|
|
244
|
+
|
|
245
|
+
2.1 A Specification Notation
|
|
246
|
+
|
|
247
|
+
Specifications are represented by structured relational expressions. We use two elementary
|
|
248
|
+
specifications, in addition to closed form relations, which are:
|
|
249
|
+
|
|
250
|
+
ffl Establish, which we denote by est(t), and define as:
|
|
251
|
+
|
|
252
|
+
est(t) = f(s; s
|
|
253
|
+
|
|
254
|
+
0
|
|
255
|
+
|
|
256
|
+
)jt(s
|
|
257
|
+
|
|
258
|
+
0
|
|
259
|
+
|
|
260
|
+
)g:
|
|
261
|
+
ffl Preserve, which we denote by prs(t), and define as:
|
|
262
|
+
|
|
263
|
+
prs(t) = f(s; s
|
|
264
|
+
|
|
265
|
+
0
|
|
266
|
+
|
|
267
|
+
)jt(s) t(s
|
|
268
|
+
|
|
269
|
+
0
|
|
270
|
+
|
|
271
|
+
)g:
|
|
272
|
+
For the sake of stepwise refinement, we decide that all our compound statements must be
|
|
273
|
+
monotonic with respect to the refinement ordering; we present some of these statements,
|
|
274
|
+
for illustrative purposes.
|
|
275
|
+
|
|
276
|
+
ffl Join. When two requirements must be satisfied simultaneously, they are combined
|
|
277
|
+
with the join (t).
|
|
278
|
+
|
|
279
|
+
ffl Meet. When any one of two requirements may be satisfied, they are combined with
|
|
280
|
+
the meet (u).
|
|
281
|
+
|
|
282
|
+
ffl Composition. Because the traditional relational product is not monotonic with respect
|
|
283
|
+
to refinement, we define a monotonic sequence-like operator, which we denote
|
|
284
|
+
by R
|
|
285
|
+
|
|
286
|
+
2
|
|
287
|
+
|
|
288
|
+
R
|
|
289
|
+
|
|
290
|
+
0
|
|
291
|
+
|
|
292
|
+
and define as
|
|
293
|
+
|
|
294
|
+
R
|
|
295
|
+
|
|
296
|
+
2
|
|
297
|
+
|
|
298
|
+
R
|
|
299
|
+
|
|
300
|
+
0
|
|
301
|
+
|
|
302
|
+
= RR
|
|
303
|
+
|
|
304
|
+
0
|
|
305
|
+
|
|
306
|
+
" RR
|
|
307
|
+
|
|
308
|
+
0
|
|
309
|
+
|
|
310
|
+
L:
|
|
311
|
+
ffl Closure. When a specification must be applied an arbitrary number of times, we
|
|
312
|
+
apply the closure operator to it, to produce
|
|
313
|
+
|
|
314
|
+
R
|
|
315
|
+
|
|
316
|
+
?
|
|
317
|
+
|
|
318
|
+
= t i0 R
|
|
319
|
+
|
|
320
|
+
i
|
|
321
|
+
|
|
322
|
+
;
|
|
323
|
+
|
|
324
|
+
where R
|
|
325
|
+
|
|
326
|
+
i
|
|
327
|
+
|
|
328
|
+
is the monotonic composition of R by itself i times.
|
|
329
|
+
|
|
330
|
+
2.2 Refinement Rules: Basis of Induction
|
|
331
|
+
|
|
332
|
+
We present a sample of refinement rules that produce a programming construct or eliminate
|
|
333
|
+
a specification construct (join, meet).
|
|
334
|
+
|
|
335
|
+
ffl R t R is refined by R.
|
|
336
|
+
|
|
337
|
+
ffl R u R
|
|
338
|
+
|
|
339
|
+
0
|
|
340
|
+
|
|
341
|
+
is refined by R (and by R
|
|
342
|
+
|
|
343
|
+
0
|
|
344
|
+
|
|
345
|
+
).
|
|
346
|
+
|
|
347
|
+
ffl If R is deterministic or R
|
|
348
|
+
|
|
349
|
+
0
|
|
350
|
+
|
|
351
|
+
is total then R 2 R
|
|
352
|
+
|
|
353
|
+
0
|
|
354
|
+
|
|
355
|
+
is refined by R; R'.
|
|
356
|
+
2.3 Refinement Rules: Merging
|
|
357
|
+
|
|
358
|
+
Given two components of the join that have the same structure, these rules merge the
|
|
359
|
+
components into a single specification that has the common structure, and propagate the
|
|
360
|
+
joins deeper into the nesting structure. A sampling of these rules is:
|
|
361
|
+
|
|
362
|
+
ffl If all the joins are defined, then (R
|
|
363
|
+
|
|
364
|
+
2
|
|
365
|
+
|
|
366
|
+
R
|
|
367
|
+
|
|
368
|
+
0
|
|
369
|
+
|
|
370
|
+
) t (Q
|
|
371
|
+
|
|
372
|
+
2
|
|
373
|
+
|
|
374
|
+
Q
|
|
375
|
+
|
|
376
|
+
0
|
|
377
|
+
|
|
378
|
+
) is refined by
|
|
379
|
+
(R t Q)
|
|
380
|
+
|
|
381
|
+
2
|
|
382
|
+
|
|
383
|
+
(R
|
|
384
|
+
|
|
385
|
+
0
|
|
386
|
+
|
|
387
|
+
t Q
|
|
388
|
+
|
|
389
|
+
0
|
|
390
|
+
|
|
391
|
+
):
|
|
392
|
+
ffl If all the joins are defined, then R
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
t Q
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
is refined by
|
|
401
|
+
(R t Q)
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
:
|
|
406
|
+
2.4 Refinement Rules: Structure Unification
|
|
407
|
+
|
|
408
|
+
While the rules of the previous section exploit the common structure of two subspecifications
|
|
409
|
+
to merge them into a single specification (that has the common structure), the
|
|
410
|
+
rules that we discuss in this section attempt to unify the structure of two components.
|
|
411
|
+
Typically, they do so by imposing the structure of one component on the other. For the
|
|
412
|
+
sake of illustration, we present two such rules, which impose a sequence structure on a
|
|
413
|
+
(structureless) relation.
|
|
414
|
+
|
|
415
|
+
ffl R is refined by (R \Theta \Theta \Theta \Theta R) 2 R,
|
|
416
|
+
|
|
417
|
+
ffl R is refined by R 2
|
|
418
|
+
|
|
419
|
+
(R B B B B R),
|
|
420
|
+
|
|
421
|
+
where (R \Theta \Theta \Theta \Theta R) is the least refined solution to the equation R v X
|
|
422
|
+
|
|
423
|
+
2
|
|
424
|
+
|
|
425
|
+
R and (R B B B B R) is the
|
|
426
|
+
least refined solution to the equation R v R
|
|
427
|
+
|
|
428
|
+
2
|
|
429
|
+
|
|
430
|
+
X . Note that for R = est(t), for some
|
|
431
|
+
predicate t, the first rule yields the decomposition
|
|
432
|
+
|
|
433
|
+
est(t) v est(true) 2 est(t);
|
|
434
|
+
|
|
435
|
+
and the second rule yields the decomposition
|
|
436
|
+
|
|
437
|
+
est(t) v est(t) 2 prs(t):
|
|
438
|
+
|
|
439
|
+
2.5 Brief Illustration
|
|
440
|
+
|
|
441
|
+
For the sake of illustration, we consider the specification of a sorting program and show
|
|
442
|
+
how we can apply some refinement steps using the method of program construction by
|
|
443
|
+
parts.
|
|
444
|
+
|
|
445
|
+
Sort
|
|
446
|
+
|
|
447
|
+
v f join structure g
|
|
448
|
+
|
|
449
|
+
Perm t Ord
|
|
450
|
+
|
|
451
|
+
v f definition of Ord g
|
|
452
|
+
|
|
453
|
+
Perm t est(sorted)
|
|
454
|
+
|
|
455
|
+
v f sorted j psorted k = N , where psorted means partially sorted g
|
|
456
|
+
|
|
457
|
+
Perm t est(psorted) t est(k = N)
|
|
458
|
+
|
|
459
|
+
v f structure unification rules g
|
|
460
|
+
|
|
461
|
+
Perm
|
|
462
|
+
|
|
463
|
+
2
|
|
464
|
+
|
|
465
|
+
Perm
|
|
466
|
+
|
|
467
|
+
t est(psorted)
|
|
468
|
+
|
|
469
|
+
2
|
|
470
|
+
|
|
471
|
+
prs(psorted)
|
|
472
|
+
|
|
473
|
+
t est(true) 2 est(k = N)
|
|
474
|
+
|
|
475
|
+
v f merging rule g
|
|
476
|
+
|
|
477
|
+
(Perm t est(psorted) t est(true))
|
|
478
|
+
|
|
479
|
+
2
|
|
480
|
+
|
|
481
|
+
(Perm t prs(psorted) t est(k = N))
|
|
482
|
+
|
|
483
|
+
v f common refinement of the first factor g
|
|
484
|
+
|
|
485
|
+
(k := 1 t k := 1 t k := 1)
|
|
486
|
+
|
|
487
|
+
2
|
|
488
|
+
|
|
489
|
+
(Perm t prs(psorted) t est(k = N))
|
|
490
|
+
|
|
491
|
+
v f basis of induction rule: eliminating joins g
|
|
492
|
+
|
|
493
|
+
(k := 1)
|
|
494
|
+
|
|
495
|
+
2
|
|
496
|
+
|
|
497
|
+
(Perm t prs(psorted) t est(k = N )).
|
|
498
|
+
|
|
499
|
+
v f basis of induction rule: replacing
|
|
500
|
+
|
|
501
|
+
2
|
|
502
|
+
|
|
503
|
+
with ; g
|
|
504
|
+
|
|
505
|
+
(k := 1) ; (Perm t prs(psorted) t est(k = N )).
|
|
506
|
+
The first term of the sequence is the initialization segment; the second term is the specification
|
|
507
|
+
of the while statement of an insertion sort.
|
|
508
|
+
3 Application: Software Incrementation
|
|
509
|
+
|
|
510
|
+
We consider a software system C and a feature F that we wish to add to C, and we are
|
|
511
|
+
interested in how to augment C so that it has feature F . Our position is that this problem
|
|
512
|
+
amounts to refining the specification
|
|
513
|
+
|
|
514
|
+
C t F:
|
|
515
|
+
|
|
516
|
+
Note that although C is a program, we can write it using our specification notation (we
|
|
517
|
+
have rules for doing that, given in [2]). For the sake of argument, we assume that C and
|
|
518
|
+
|
|
519
|
+
F do indeed have a join, and that C is structured as a sequence of three components, say
|
|
520
|
+
|
|
521
|
+
C = C 0 2 C 1 2 C 2 :
|
|
522
|
+
|
|
523
|
+
We assume further that after analyzing C and F , we have determined that modifications
|
|
524
|
+
of C to augment it with F are localized in component C 1 . In light of this analysis, we
|
|
525
|
+
deccompose F as
|
|
526
|
+
|
|
527
|
+
F v (F \Theta \Theta \Theta \Theta F ) 2 F 2 (F B B B B F );
|
|
528
|
+
using the structure unification rules given above. It may be worthwhile at this stage
|
|
529
|
+
to analyze the intuitive meaning of (F \Theta \Theta \Theta \Theta F ) and (F B B B B F ): the term (F \Theta \Theta \Theta \Theta F ) represents the
|
|
530
|
+
minimal (with respect to refinement) specification that must be satisfied upstream of
|
|
531
|
+
|
|
532
|
+
F in order not to destroy any information that F may need; for example, if F is the
|
|
533
|
+
specification of a sort routine, (F \Theta \Theta \Theta \Theta F ) is specification Perm, which prescribes that no cell
|
|
534
|
+
of the array to be sorted is lost. Also, the term (F B B B B F ) represents the minimal (with
|
|
535
|
+
respect to refinement) specification that must be satisfied downstream of F in order not
|
|
536
|
+
to destroy the work achieved by F ; if F is the specification of a sort routine, then (F B B B B F ) is
|
|
537
|
+
the specification that prescribes that array a (which has been sorted by F ) is kept intact.
|
|
538
|
+
Using the sequential decomposition of C and F into three terms, we find the following
|
|
539
|
+
refinement:
|
|
540
|
+
|
|
541
|
+
C t F
|
|
542
|
+
|
|
543
|
+
v f substitution g
|
|
544
|
+
|
|
545
|
+
(C 0
|
|
546
|
+
|
|
547
|
+
2
|
|
548
|
+
|
|
549
|
+
C 1
|
|
550
|
+
|
|
551
|
+
2
|
|
552
|
+
|
|
553
|
+
C 2 ) t
|
|
554
|
+
|
|
555
|
+
(F \Theta \Theta \Theta \Theta F )
|
|
556
|
+
|
|
557
|
+
2
|
|
558
|
+
|
|
559
|
+
F
|
|
560
|
+
|
|
561
|
+
2
|
|
562
|
+
|
|
563
|
+
(F B B B B F )
|
|
564
|
+
|
|
565
|
+
v f merging g
|
|
566
|
+
|
|
567
|
+
(C 0 t (F \Theta \Theta \Theta \Theta F ))
|
|
568
|
+
|
|
569
|
+
2
|
|
570
|
+
|
|
571
|
+
(C 1 t F )
|
|
572
|
+
|
|
573
|
+
2
|
|
574
|
+
|
|
575
|
+
(C 2 t (F B B B B F )).
|
|
576
|
+
We consider the first term of the product, and analyze the possibilities that may arise (the
|
|
577
|
+
same discussion holds for the third term):
|
|
578
|
+
|
|
579
|
+
ffl C 0 and (F \Theta \Theta \Theta \Theta F ) have no join; this means that the decompositions of F and C have not
|
|
580
|
+
been lined up, and must be revised. To illustrate what it means for decompositions
|
|
581
|
+
to be lined up, consider the following relations:
|
|
582
|
+
|
|
583
|
+
R
|
|
584
|
+
|
|
585
|
+
0
|
|
586
|
+
|
|
587
|
+
= f(s; s
|
|
588
|
+
|
|
589
|
+
0
|
|
590
|
+
|
|
591
|
+
)js
|
|
592
|
+
|
|
593
|
+
0
|
|
594
|
+
|
|
595
|
+
= s + 3g, R
|
|
596
|
+
|
|
597
|
+
00
|
|
598
|
+
|
|
599
|
+
= f(s; s
|
|
600
|
+
|
|
601
|
+
0
|
|
602
|
+
|
|
603
|
+
)js + 7 s
|
|
604
|
+
|
|
605
|
+
0
|
|
606
|
+
|
|
607
|
+
s + 8g.
|
|
608
|
+
|
|
609
|
+
Q
|
|
610
|
+
|
|
611
|
+
0
|
|
612
|
+
|
|
613
|
+
= f(s; s
|
|
614
|
+
|
|
615
|
+
0
|
|
616
|
+
|
|
617
|
+
)js + 3 s
|
|
618
|
+
|
|
619
|
+
0
|
|
620
|
+
|
|
621
|
+
s + 4g, Q
|
|
622
|
+
|
|
623
|
+
00
|
|
624
|
+
|
|
625
|
+
= f(s; s
|
|
626
|
+
|
|
627
|
+
0
|
|
628
|
+
|
|
629
|
+
)js
|
|
630
|
+
|
|
631
|
+
0
|
|
632
|
+
|
|
633
|
+
= s + 7g.
|
|
634
|
+
|
|
635
|
+
R = Q = f(s; s
|
|
636
|
+
|
|
637
|
+
0
|
|
638
|
+
|
|
639
|
+
)js + 10 s
|
|
640
|
+
|
|
641
|
+
0
|
|
642
|
+
|
|
643
|
+
s + 11g.
|
|
644
|
+
Relations R and Q do have a join since they are identical; if we decompose R as
|
|
645
|
+
|
|
646
|
+
R
|
|
647
|
+
|
|
648
|
+
0
|
|
649
|
+
|
|
650
|
+
2
|
|
651
|
+
|
|
652
|
+
R
|
|
653
|
+
|
|
654
|
+
00
|
|
655
|
+
|
|
656
|
+
and decompose Q as Q
|
|
657
|
+
|
|
658
|
+
0
|
|
659
|
+
|
|
660
|
+
2
|
|
661
|
+
|
|
662
|
+
Q
|
|
663
|
+
|
|
664
|
+
00
|
|
665
|
+
|
|
666
|
+
then we obtain a lined up decomposition, since
|
|
667
|
+
|
|
668
|
+
R
|
|
669
|
+
|
|
670
|
+
0
|
|
671
|
+
|
|
672
|
+
and Q
|
|
673
|
+
|
|
674
|
+
0
|
|
675
|
+
|
|
676
|
+
have a join (R
|
|
677
|
+
|
|
678
|
+
0
|
|
679
|
+
|
|
680
|
+
), and R
|
|
681
|
+
|
|
682
|
+
00
|
|
683
|
+
|
|
684
|
+
and Q
|
|
685
|
+
|
|
686
|
+
00
|
|
687
|
+
|
|
688
|
+
have a join (Q
|
|
689
|
+
|
|
690
|
+
00
|
|
691
|
+
|
|
692
|
+
); but if we decompose R
|
|
693
|
+
|
|
694
|
+
as R
|
|
695
|
+
|
|
696
|
+
0
|
|
697
|
+
|
|
698
|
+
2
|
|
699
|
+
|
|
700
|
+
R
|
|
701
|
+
|
|
702
|
+
00
|
|
703
|
+
|
|
704
|
+
and Q as Q
|
|
705
|
+
|
|
706
|
+
00
|
|
707
|
+
|
|
708
|
+
2
|
|
709
|
+
|
|
710
|
+
Q
|
|
711
|
+
|
|
712
|
+
0
|
|
713
|
+
|
|
714
|
+
then we do not obtain a lined up decomposition, because
|
|
715
|
+
neither R
|
|
716
|
+
|
|
717
|
+
0
|
|
718
|
+
|
|
719
|
+
and Q
|
|
720
|
+
|
|
721
|
+
00
|
|
722
|
+
|
|
723
|
+
nor R
|
|
724
|
+
|
|
725
|
+
00
|
|
726
|
+
|
|
727
|
+
and Q
|
|
728
|
+
|
|
729
|
+
0
|
|
730
|
+
|
|
731
|
+
have a join.
|
|
732
|
+
|
|
733
|
+
ffl C 0 and (F \Theta \Theta \Theta \Theta F ) do have a join, and C 0 does not refine (F \Theta \Theta \Theta \Theta F ). This means that C 0
|
|
734
|
+
|
|
735
|
+
must be modified to accomodate specification (F \Theta \Theta \Theta \Theta F ), hence enable the application
|
|
736
|
+
of function F in the next component (C 1 t F ). The modification of C 0 is carried
|
|
737
|
+
out using the refinement rules of the calculus of programming by parts.
|
|
738
|
+
|
|
739
|
+
ffl C 0 and (F \Theta \Theta \Theta \Theta F ) do have a join; furthermore, C 0 refines (F \Theta \Theta \Theta \Theta F ). This is the ideal
|
|
740
|
+
case: it means that the modification of C does not involve component C 0 , since
|
|
741
|
+
|
|
742
|
+
C 0 preserves all the information required to compute function F . The verification
|
|
743
|
+
condition provided for this case, which is
|
|
744
|
+
|
|
745
|
+
C 0 w (F \Theta \Theta \Theta \Theta F )
|
|
746
|
+
(along with the homologous condition, C 2 w (F B B B B F )) consitutes the necessary condition
|
|
747
|
+
under which the modification of C to augment it with F is localized to component
|
|
748
|
+
C 1 .
|
|
749
|
+
4 Application: Software Merging
|
|
750
|
+
|
|
751
|
+
We consider two versions, say V and W , of some software system, and we are interested
|
|
752
|
+
in merging them into a single version that has all the features of V and all the features of
|
|
753
|
+
|
|
754
|
+
W . We view this problem as that of refining the expression
|
|
755
|
+
|
|
756
|
+
V t W:
|
|
757
|
+
|
|
758
|
+
Because V and W stem presumably from a common original system by incrementation,
|
|
759
|
+
it is reasonable to expect that large portions of V and W are common, and that their
|
|
760
|
+
differences are localized. For the sake of argument, we assume that both V and W are
|
|
761
|
+
structured as sequences, which we write as:
|
|
762
|
+
|
|
763
|
+
V t W
|
|
764
|
+
|
|
765
|
+
v f substitutions g
|
|
766
|
+
|
|
767
|
+
(V 0 2
|
|
768
|
+
|
|
769
|
+
V 1 2
|
|
770
|
+
|
|
771
|
+
V 2 )
|
|
772
|
+
|
|
773
|
+
t(W 0
|
|
774
|
+
|
|
775
|
+
2
|
|
776
|
+
|
|
777
|
+
W 1
|
|
778
|
+
|
|
779
|
+
2
|
|
780
|
+
|
|
781
|
+
W 2 )
|
|
782
|
+
|
|
783
|
+
v f merging g
|
|
784
|
+
|
|
785
|
+
((V 0 t W 0 )
|
|
786
|
+
|
|
787
|
+
2
|
|
788
|
+
|
|
789
|
+
(V 1 t W 1 )
|
|
790
|
+
|
|
791
|
+
2
|
|
792
|
+
|
|
793
|
+
(V 2 t W 2 )).
|
|
794
|
+
We imagine, for the sake of argument, that
|
|
795
|
+
|
|
796
|
+
ffl The feature of V that W does not have is localized in V 1 ; hence V 1 w W 1 , whence
|
|
797
|
+
|
|
798
|
+
V 1 t W 1 = V 1 .
|
|
799
|
+
|
|
800
|
+
ffl The feature of W that V does not have is localized in W 2 ; hence W 2 w V 2 , whence
|
|
801
|
+
|
|
802
|
+
V 2 t W 2 = W 2 .
|
|
803
|
+
|
|
804
|
+
ffl The components V 0 and W 0 have not been changed from the original version of the
|
|
805
|
+
software system, hence are identical; whence V 0 t W 0 = V 0 .
|
|
806
|
+
Under the condition hypothesized above, the new version of the software system become,
|
|
807
|
+
after substitution:
|
|
808
|
+
|
|
809
|
+
V 0
|
|
810
|
+
|
|
811
|
+
2
|
|
812
|
+
|
|
813
|
+
V 1
|
|
814
|
+
|
|
815
|
+
2
|
|
816
|
+
|
|
817
|
+
W 2 :
|
|
818
|
+
|
|
819
|
+
5 Application: Software Adaptation
|
|
820
|
+
|
|
821
|
+
We consider a software component C and a specification K; we assume that C does not
|
|
822
|
+
satisfy specification K, but we have reasons to believe that it can be modified economically
|
|
823
|
+
to satisfy it. This problem does look like the refinement of K t C, since it proceeds by
|
|
824
|
+
considering information from two specifications/programs, but differs in two significant
|
|
825
|
+
ways:
|
|
826
|
+
|
|
827
|
+
ffl Whereas the refinement of K t C seeks to satisfy both K and C, the modification
|
|
828
|
+
of C to satisfy K really seeks to satisfy K only ---but expects to use C towards this
|
|
829
|
+
end.
|
|
830
|
+
|
|
831
|
+
ffl Whereas structure unification rules of program construction by parts consider the
|
|
832
|
+
two arguments as interchangeable, and may impose any one argument's structure
|
|
833
|
+
on the other, software adaptation rules will always attempt to impose the structure
|
|
834
|
+
of C on K. In effect, what happens in software adaptation is that the refinement
|
|
835
|
+
proceeds by drawing syntactic information from C and semantic information from
|
|
836
|
+
|
|
837
|
+
K, to produce a component that acts (semantics) like K but looks (syntax) like C.
|
|
838
|
+
|
|
839
|
+
To acknowledge the asymmetry between the roles played by K and C in the adaptation
|
|
840
|
+
of C to satisfy K, we write the expression to refine as
|
|
841
|
+
|
|
842
|
+
K C;
|
|
843
|
+
|
|
844
|
+
and we derive slightly different refinement rules for the operator than we had for the
|
|
845
|
+
|
|
846
|
+
t operator. Space limitations prohibit us from presenting these rules, and from giving an
|
|
847
|
+
illustrative example.
|
|
848
|
+
6 Conclusion
|
|
849
|
+
|
|
850
|
+
In this paper we have briefly presented a calculus of program construction by parts,
|
|
851
|
+
and have discussed its use for recent software development paradigms, such as software
|
|
852
|
+
incrementation, software merging, and software adaptation.
|
|
853
|
+
Several authors have advocated that the join operator is useful in the refinement
|
|
854
|
+
of complex specifications [2, 4, 1]. Hoare et al [1] identifies some basic properties of
|
|
855
|
+
join, like idempotence, commutativity, associativity and absorption. They also mention
|
|
856
|
+
distributivity over usual programming constructs like sequential composition, alternation,
|
|
857
|
+
iteration and nondeterministic choice, but for a very limited case of join (directed set of
|
|
858
|
+
subspecifications with bounded nondeterminacy). Recent work of Hehner [4] includes laws
|
|
859
|
+
of refinement for join-structured specifications. In Hehner's calculus, specifications are
|
|
860
|
+
predicates, termination is prescribed using a time variable, and join is logical conjunction.
|
|
861
|
+
Morgan and Gardiner [3] use a join statement for data refinement and for the definition
|
|
862
|
+
of logical constants. They do not use join as a specification structuring device nor do they
|
|
863
|
+
study the refinement of join-structured specifications. Finally, the work of von Wright
|
|
864
|
+
also mentions a join operator. In [7], he reconstructs the refinement calculus of Back from
|
|
865
|
+
elementary primitives. The emphasis of this work is more on the definition of a language
|
|
866
|
+
than on the definition of a refinement calculus. The semantics of the language is given by
|
|
867
|
+
predicate transformers, and miraculous specifications are allowed.
|
|
868
|
+
Our work differs from Hehner's work by the representation of specifications (predicates
|
|
869
|
+
vs. relations) and by their interpretations: termination is implicit in our specifications
|
|
870
|
+
|
|
871
|
+
whereas it is expressed as timing constraints in Hehner's. Our work differs from that of
|
|
872
|
+
Hoare et al [1] by using partial relations and demonic operators, by not using a fictitious
|
|
873
|
+
state to represent nontermination, and by providing rules to eliminate meets in a
|
|
874
|
+
specification. Our work differs from the work of von Wright, Gardiner and Morgan by
|
|
875
|
+
using a different semantics, by not allowing miraculous specifications, and by studying the
|
|
876
|
+
transformation of join-structured specifications. We share with the work of Sekerinski [5]
|
|
877
|
+
(and Z) the same specification model where the focus is on input-output pairs for which
|
|
878
|
+
a program must terminate. Most importantly, the work presented in this paper differs
|
|
879
|
+
from other programming calculi (including our own [2]) by the fact that it deals with new
|
|
880
|
+
software development paradigms rather than traditional program construction.
|
|
881
|
+
References
|
|
882
|
+
|
|
883
|
+
[1] C.A.R. Hoare et al. Laws of programming. Communications of the ACM, 30(8):672--
|
|
884
|
+
686, 1987.
|
|
885
|
+
[2] M. Frappier, J. Desharnais, and A. Mili. A calculus of program construction by parts.
|
|
886
|
+
|
|
887
|
+
Science of Computer Programming, 6:237--254, 1996.
|
|
888
|
+
[3] P. Gardiner and C.C. Morgan. Data refinement of predicate transformers. Theoretical
|
|
889
|
+
Computer Science, 87:143--162, 1991.
|
|
890
|
+
[4] E.C.R. Hehner. A Practical Theory of Programming. Springer-Verlag, 1993.
|
|
891
|
+
[5] E. Sekerinski. A calculus for predicative programming. In R.S. Bird, C.C. Morgan, and
|
|
892
|
+
J.C.P. Woodcock, editors, Mathematics of program construction : second international
|
|
893
|
+
conference, number 669 in Lecture Notes in Computer Science, Oxford, UK, 1992.
|
|
894
|
+
Springer-Verlag.
|
|
895
|
+
[6] D.R. Skuce and A. Mili. Behavioral specifications in object oriented programming.
|
|
896
|
+
|
|
897
|
+
Journal of Object Oriented Programming, pages 41--49, January 1995.
|
|
898
|
+
[7] J. Von Wright. A lattice theoretical basis for program refinement. Technical report,
|
|
899
|
+
Dept. of Computer Science,
|
|
900
|
+
|
|
901
|
+
Abo Akademi, Finland, 1990.
|
|
902
|
+
|