Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tables/tet
  • milocj/tet
  • elgendya/tet
3 results
Show changes
Showing
with 232 additions and 49 deletions
%% upgrade
% Preforms any necessary upgrades to the TET to comply with the latest version.
% inputs:
% object - Grid object
% outputs:
% none
% Author: Matthew Dawson <matthew@mjdsystems.ca>
% Organization: McMaster Centre for Software Certification
function upgrade( object )
for i=1:size(object.cells, 2)
object.cells(i).upgrade
end
end
...@@ -19,23 +19,23 @@ classdef PVS_checker < handle ...@@ -19,23 +19,23 @@ classdef PVS_checker < handle
% Static Functions % Static Functions
methods(Static) methods(Static)
[theory_id, decls] = parse_prf_file(string) [theory_id, decls] = parse_prf_file(string);
[decl_id,new_pos] = parse_decl_id(string,pos) [decl_id,new_pos] = parse_decl_id(string,pos);
[id,new_pos] = parse_id(string,pos) [id,new_pos] = parse_id(string,pos);
[paren_string, new_pos] = parse_paren(string,pos) [paren_string, new_pos] = parse_paren(string,pos);
matlab_type = matlab_type_to_pvs_type( pvs_type ) matlab_type = matlab_type_to_pvs_type( pvs_type );
version = get_pvs_version version = get_pvs_version;
[ replaced ] = replace_types_sim( pvs_type, sim_type ) [ replaced ] = replace_types_sim( pvs_type, sim_type );
end end
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
function status = check_status(object) function status = check_status(object)
script_name = object.generate_pvs_status_script(object.data.function_name); script_name = object.generate_pvs_status_script(object.data.function_name );
[status, result] = system(['pvs -batch -v 3 -l ' script_name]); [status, result] = system(['pvs -batch -v 3 -l ' script_name]);
parsed = object.parse_status(result); parsed = object.parse_status(result);
pass = 1; pass = 1;
...@@ -24,7 +24,7 @@ for i=1:2:size(parsed,2)-1 ...@@ -24,7 +24,7 @@ for i=1:2:size(parsed,2)-1
end end
status = pass; status = pass;
delete(script_name); delete(script_name)
end end
...@@ -87,7 +87,17 @@ fileid = fopen([filename '.pvs'],'w'); ...@@ -87,7 +87,17 @@ fileid = fopen([filename '.pvs'],'w');
code = []; code = [];
code = sprintf('%s:THEORY\nBEGIN\n',function_name); code = sprintf('%s:THEORY\nBEGIN\n',function_name);
%code = [code sprintf('IMPORTING Funcs\n')]; %code = [code sprintf('IMPORTING Funcs\n')];
code = [code object.pvs_check_for_imports]; imports = object.pvs_check_for_imports;
if ~isempty(imports)
if ~isempty(regexp(imports,'double|single', 'once'))
% flag to copy files
error = 2;
end
end
code = [code imports];
code = [code object.user_imports]; code = [code object.user_imports];
if object.type_mode if object.type_mode
...@@ -130,23 +140,7 @@ end ...@@ -130,23 +140,7 @@ end
end end
code = [code sprintf('%s(%s):%s = \n',function_name,inputs_new,function_name_type)]; code = [code sprintf('%s(%s):%s = \n',function_name,inputs_new,function_name_type)];
%else
%inputs_new = [];
%for i=1:size(object.input_type,1)
% inputs_new = [inputs_new char(object.input_type(i,1)) ':' PVS_checker.matlab_type_to_pvs_type(char(object.input_type(i,2)))];
% if(i~=(size(object.input_type,1)))
% inputs_new = [inputs_new ','];
% end
%end
%code = [code sprintf('%s(%s):%s = \n',function_name,inputs_new,function_name_type)];
%code = [code sprintf('%s(%s):real = \n',object.data.function_name,inputs_new)];
%end
code = [code object.generate_pvs(object.data.Grid1,object.data.Grid2,0)]; code = [code object.generate_pvs(object.data.Grid1,object.data.Grid2,0)];
code = [code sprintf('\nEND %s',function_name)]; code = [code sprintf('\nEND %s',function_name)];
fprintf(fileid,code); fprintf(fileid,code);
......
...@@ -37,7 +37,7 @@ for i=1:size(g1.cells,2) ...@@ -37,7 +37,7 @@ for i=1:size(g1.cells,2)
resultcell = object.data.Grid0.search_return(g1.cells(i),g2_cell); resultcell = object.data.Grid0.search_return(g1.cells(i),g2_cell);
if(~isempty(resultcell)) if(~isempty(resultcell))
%if (i == 1) %if (i == 1)
code = [code sprintf('%s',strtrim(char(resultcell.result_text)))]; code = [code sprintf('%s',object.matlab_to_pvs_syntax_translation(strtrim(char(resultcell.result_text))))];
%else %else
% code2 = [code2 sprintf(',%s',strtrim(char(resultcell.result_text)))]; % code2 = [code2 sprintf(',%s',strtrim(char(resultcell.result_text)))];
%end %end
......
...@@ -9,10 +9,13 @@ ...@@ -9,10 +9,13 @@
% none % none
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
function [] = generate_pvs_script(object,filename) function [] = generate_pvs_script(object,filename,sim_types)
fileid = fopen([filename '.el'],'w'); fileid = fopen([filename '.el'],'w');
code = ['(prove-tccs-pvs-file "' filename '" "(try (try (tcc) (try (assert) (skip) (fail) ) (fail))(skip) (random-test :count ' sprintf('%ld',object.data.settings.count) ' :size ' sprintf('%d',object.data.settings.range) '))" )' sprintf('\n')]; %if sim_types == 0
code = ['(prove-tccs-pvs-file "' filename '" "(try (try (subtype-tcc) (try (assert) (skip) (fail) ) (fail))(skip) (random-test :count ' sprintf('%ld',object.data.settings.count) ' :size ' sprintf('%d',object.data.settings.range) '))" )' sprintf('\n')];
%else
% code = ['(prove-tccs-pvs-file "' filename '" "(try (try (subtype-tcc) (try (assert) (skip) (fail) ) (fail))(skip) (random-test :count ' sprintf('%ld',object.data.settings.count) ' :size ' sprintf('%d',object.data.settings.range) '))" )' sprintf('\n')];
%end
fprintf(fileid,code); fprintf(fileid,code);
fclose(fileid); fclose(fileid);
end end
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
function [script_name] = generate_pvs_status_script(object,filename) function [script_name] = generate_pvs_status_script(object,filename)
script_name = [filename '_status' '.el']; script_name = [filename '_status' '.el'];
fileid = fopen(script_name,'w'); fileid = fopen(script_name,'w');
code = ['(status-proof-pvs-file "' filename '")']; code = ['(typecheck-prove "' filename '") (status-proof-pvs-file "' filename '")'];
fprintf(fileid,code); fprintf(fileid,code);
fclose(fileid); fclose(fileid);
......
...@@ -12,12 +12,19 @@ ...@@ -12,12 +12,19 @@
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
function pvs_string = matlab_to_pvs_syntax_translation(object,matlab_string) function pvs_string = matlab_to_pvs_syntax_translation(object,matlab_string)
s = [matlab_string(1,:)];
for j = 2:size(matlab_string,1)
s = [s ' ' matlab_string(j,:)];
end
matlab_string = s;
pvs_string = regexprep(matlab_string,'&&',' AND '); pvs_string = regexprep(matlab_string,'&&',' AND ');
pvs_string = regexprep(pvs_string,'~(?!=)',' NOT '); pvs_string = regexprep(pvs_string,'~(?!=)',' NOT ');
pvs_string = regexprep(pvs_string,'~=',' /= '); pvs_string = regexprep(pvs_string,'~=',' /= ');
pvs_string = regexprep(pvs_string,'==',' = '); pvs_string = regexprep(pvs_string,'==',' = ');
pvs_string = regexprep(pvs_string,'\|\|',' OR '); pvs_string = regexprep(pvs_string,'\|\|',' OR ');
pvs_string = regexprep(pvs_string,'ceil','ceiling'); pvs_string = regexprep(pvs_string,'ceil','ceiling');
pvs_string = regexprep(pvs_string,'NaN','invalid');
end end
......
...@@ -5,8 +5,8 @@ ...@@ -5,8 +5,8 @@
% object:PVS_checker - PVS_checker object % object:PVS_checker - PVS_checker object
% result:string - string containing text that comes back from pvs % result:string - string containing text that comes back from pvs
% outputs: % outputs:
% output:structure - results paresed into structure for easier % output:structure - results parsed into structure for easier
% manipulatings % manipulating
% error:boolean - 0 if no error, 1 if error found during parsing. % error:boolean - 0 if no error, 1 if error found during parsing.
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
...@@ -24,14 +24,16 @@ else ...@@ -24,14 +24,16 @@ else
% These parsing depend on the version of PVS used, % These parsing depend on the version of PVS used,
% which may be a bad idea, although pvs is not % which may be a bad idea, although pvs is not
if strncmp(object.pvs_version,'PVS Version 4.0',15) if object.pvs_version <= 4.0
% find the TCC that was unprovable % find the TCC that was unprovable
search_str = sprintf('(?<=Proving formula %s[\\n]*)%s.*?(?=[ \\n]*Rerunning step)',char(found(i)),char(found(i))); search_str = sprintf('(?<=Proving formula %s[\\n]*)%s.*?(?=[ \\n]*Rerunning step)',char(found(i)),char(found(i)));
elseif strncmp(object.pvs_version,'PVS Version 4.2',15) elseif object.pvs_version <= 4.2
search_str = sprintf('(?<=Installing rewrite rule singleton_rew\\s\\s)%s.*?(?=[ \\n]*Rerunning step)',char(found(i))); search_str = sprintf('(?<=Installing rewrite rule \\w+\\s\\s)%s.*?(?=[ \\n]*Rerunning step)',char(found(i)));
elseif object.pvs_version >= 5.0
search_str = sprintf('(?<=Installing rewrite rule.*\\s\\s)%s.*?(?=[ \\n]*Rerunning step)',char(found(i)));
end end
found2 = regexp(result,char(search_str),'match','once'); found2 = regexp(result,char(search_str),'match','once');
% find the counter examples % find the counter examples
search_str = sprintf('(?<=%s.*?substitutions:).*?(?=This will undo the proof to: \\n%s)|(?<=%s.*?)No counter-examples(?=.*?%s)',char(found(i)),char(found(i)),char(found(i)),char(found(i))); search_str = sprintf('(?<=%s.*?substitutions:).*?(?=This will undo the proof to: \\n%s)|(?<=%s.*?)No counter-examples(?=.*?%s)',char(found(i)),char(found(i)),char(found(i)),char(found(i)));
......
...@@ -16,12 +16,24 @@ output = []; ...@@ -16,12 +16,24 @@ output = [];
function_names = EMLGenerator.parse_inputs(object.data.function_name); function_names = EMLGenerator.parse_inputs(object.data.function_name);
function_name = char(function_names{1}(1)); function_name = char(function_names{1}(1));
error = object.generate_pvs_file(function_name); error = object.generate_pvs_file(function_name);
if error == 1 if error == 1
return; return;
elseif error == 2
% copy pvs files over.
copyfile(fullfile(fileparts(which('TTdiag')),'PVS_theories','*.pvs'),pwd);
copyfile(fullfile(fileparts(which('TTdiag')),'PVS_theories','*.prf'),pwd);
end end
object.pvs_version = PVS_checker.get_pvs_version;
version_string = PVS_checker.get_pvs_version;
version = regexp(version_string, 'PVS Version (...)', 'tokens');
object.pvs_version = str2double(char(version{1}));
% THIS SECTION NEEDS SOME WORK % THIS SECTION NEEDS SOME WORK
...@@ -52,12 +64,14 @@ elseif (exists == 0 || strcmp(button,'Attempt to prove')) ...@@ -52,12 +64,14 @@ elseif (exists == 0 || strcmp(button,'Attempt to prove'))
% generate the proof script % generate the proof script
object.generate_pvs_script(function_name); object.generate_pvs_script(function_name,1);
waitbar(.10,box,'Running Proof'); waitbar(.10,box,'Running Proof');
%--------- %---------
% call pvs in batch mode with script % call pvs in batch mode with script
% ADD check that pvs actually exists in system % ADD check that pvs actually exists in system
[status, result] = system(['pvs -batch -v 3 -l ' function_name '.el']) %
[status, result] = safe_execute_external_command(['pvs -batch -v 3 -l ' function_name '.el']);
%toc
%objectect.msgbox_scroll(result); %objectect.msgbox_scroll(result);
waitbar(.70,box,'Parsing Results'); waitbar(.70,box,'Parsing Results');
[parsed error] = object.parse_pvs_result(result); [parsed error] = object.parse_pvs_result(result);
...@@ -76,7 +90,7 @@ elseif (exists == 0 || strcmp(button,'Attempt to prove')) ...@@ -76,7 +90,7 @@ elseif (exists == 0 || strcmp(button,'Attempt to prove'))
end end
waitbar(.100,box,'Deleting Proof Script'); waitbar(.100,box,'Deleting Proof Script');
delete([function_name '.el']); %delete([function_name '.el']);
delete(box); delete(box);
end end
......
...@@ -10,8 +10,73 @@ ...@@ -10,8 +10,73 @@
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
function string = pvs_check_for_imports(object) function string = pvs_check_for_imports(object)
[string,found] = object.pvs_check_for_imports_g(object.data.Grid2,{}); [string,found] = object.pvs_check_for_imports_g(object.data.Grid2,{});
[string2,found2] = object.pvs_check_for_imports_g(object.data.Grid1,found); [string2,found2] = object.pvs_check_for_imports_g(object.data.Grid1,found);
% check for imports in the inputs field
hashtable = {{'sqrt', 'reals@sqrt'} {'sin', 'trig@trig_basic'} {'cos', 'trig@trig_basic'} {'tan', 'trig@trig_basic'} {'double', 'double'} {'single' 'single'}} ;
% check for imports in the results grid.
for i=1:size(object.data.Grid0.Cells,2)
text = char(object.data.Grid0.Cells(i).result_text);
vars = regexp(text,'([a-zA-Z][a-zA-Z0-9_]*)','match');
for j=1:size(vars,2)
if(exist(vars{j},'file')==2 && ~strcmp(vars{j},'otherwise'))
%check if already imported file
if (~any(ismember(found,vars{j})))
string = [string 'IMPORTING ' vars{j} sprintf('\n')];
found = [found vars{j}];
end
end
for k=1:size(hashtable,2)
if strcmp(vars{j},hashtable{k}(1))
if (~any(ismember(found,vars{j})))
string = [string 'IMPORTING ' char(hashtable{k}(2)) sprintf('\n')];
found = [found vars{j}];
end
end
end
end
end
for k=1:size(hashtable,2)
string_parts = char(object.data.function_inputs);
s = [string_parts(1,:)];
for j = 2:size(string_parts,1)
s = [s ' ' string_parts(j,:)];
end
string_parts = s;
functions = regexp(string_parts,hashtable{k}(1),'once');
if ~isempty(functions{1})
if (~any(ismember(found,hashtable{k}(1))))
string = [string 'IMPORTING ' char(hashtable{k}(2)) sprintf('\n')];
found = [found hashtable{k}(1)];
end
end
end
string = [string string2]; string = [string string2];
end end
...@@ -14,15 +14,29 @@ ...@@ -14,15 +14,29 @@
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
function [string,found] = pvs_check_for_imports_g(object,grid,found) function [string,found] = pvs_check_for_imports_g(object,grid,found)
string = []; string = [];
hashtable = {{'sqrt', 'reals@sqrt'} {'sin', 'trig@trig_basic'} {'cos', 'trig@trig_basic'} {'tan', 'trig@trig_basic'}};
for i=1:size(grid.cells,2) for i=1:size(grid.cells,2)
% recurse through % recurse through
if (~isempty(grid.cells(i).subgrid)) if (~isempty(grid.cells(i).subgrid))
string = [string object.pvs_check_for_imports_g(grid.cells(i).subgrid)]; string = [string object.pvs_check_for_imports_g(grid.cells(i).subgrid)];
end end
text = char(grid.cells(i).cond_text); text = char(grid.cells(i).cond_text);
if size(text) > 0
s = [text(1,:)];
for j = 2:size(text,1)
s = [s ' ' text(j,:)];
end
text = s;
end
vars = regexp(text,'([a-zA-Z][a-zA-Z0-9_]*)','match'); vars = regexp(text,'([a-zA-Z][a-zA-Z0-9_]*)','match');
for j=1:size(vars,2) for j=1:size(vars,2)
if(exist(vars{j},'file')==2 && ~strcmp(vars{j},'otherwise')) if(exist(vars{j},'file')==2 && ~strcmp(vars{j},'otherwise'))
%check if already imported file %check if already imported file
...@@ -31,6 +45,15 @@ for i=1:size(grid.cells,2) ...@@ -31,6 +45,15 @@ for i=1:size(grid.cells,2)
found = [found vars{j}]; found = [found vars{j}];
end end
end end
for k=1:size(hashtable,2)
if strcmp(vars{j},hashtable{k}(1))
if (~any(ismember(found,vars{j})))
string = [string 'IMPORTING ' char(hashtable{k}(2)) sprintf('\n')];
found = [found vars{j}];
end
end
end
end end
end end
end end
......
%% purge
% Removes useless data from the block on saving, avoiding unnecessary
% changes and data storage.
% inputs:
% object - RCell object
% outputs:
% none
% Author: Matthew Dawson <matthew@mjdsystems.ca>
% Organization: McMaster Centre for Software Certification
function purge( object )
object.result = [];
end
%% upgrade
% Preforms any necessary upgrades to the TET to comply with the latest version.
% inputs:
% object - RCell object
% outputs:
% none
% Author: Matthew Dawson <matthew@mjdsystems.ca>
% Organization: McMaster Centre for Software Certification
function upgrade( object )
if iscell(object.result_text)
object.result_text = object.result_text{1};
end
end
...@@ -17,7 +17,7 @@ for i=1:size(object.Cells,2) ...@@ -17,7 +17,7 @@ for i=1:size(object.Cells,2)
end end
end end
if(~isempty(deleted)) if(~isempty(deleted))
delete(object.Cells(deleted).result); delete([object.Cells(deleted).result]);
object.Cells(deleted) = []; object.Cells(deleted) = [];
end end
end end
......
...@@ -20,7 +20,7 @@ for i=1:size(object.Cells,2) ...@@ -20,7 +20,7 @@ for i=1:size(object.Cells,2)
end end
end end
if(~isempty(deleted)) if(~isempty(deleted))
delete(object.Cells(deleted).result); delete([object.Cells(deleted).result]);
object.Cells(deleted) = []; object.Cells(deleted) = [];
end end
end end
......
%% purge
% Removes useless data from the block on saving, avoiding unnecessary
% changes and data storage.
% inputs:
% object - RGrid object
% outputs:
% none
% Author: Matthew Dawson <matthew@mjdsystems.ca>
% Organization: McMaster Centre for Software Certification
function purge( object )
for i = 1:size(object.Cells, 2)
object.Cells(i).purge;
end
end
%% upgrade
% Preforms any necessary upgrades to the TET to comply with the latest version.
% inputs:
% object - RGrid object
% outputs:
% none
% Author: Matthew Dawson <matthew@mjdsystems.ca>
% Organization: McMaster Centre for Software Certification
function upgrade( object )
for i = 1:size(object.Cells, 2)
object.Cells(i).upgrade;
end
end
% Author: Colin Eles elesc@mcmaster.ca % Author: Colin Eles elesc@mcmaster.ca
% Organization: McMaster Centre for Software Certification % Organization: McMaster Centre for Software Certification
classdef Settings < handle classdef TTSettings < handle
%UNTITLED Summary of this class goes here %UNTITLED Summary of this class goes here
% Detailed explanation goes here % Detailed explanation goes here
...@@ -9,6 +9,7 @@ classdef Settings < handle ...@@ -9,6 +9,7 @@ classdef Settings < handle
pvs_includes = []; pvs_includes = [];
counter_trials = []; counter_trials = [];
counter_range = []; counter_range = [];
except = [];
% gui elements % gui elements
fig_width = 400; fig_width = 400;
...@@ -23,9 +24,10 @@ classdef Settings < handle ...@@ -23,9 +24,10 @@ classdef Settings < handle
label_width = 75; label_width = 75;
text_offset = 10; text_offset = 10;
include_text = [] include_text = [];
count_text = [] count_text = [];
range_text = [] range_text = [];
except_check = [];
end end
methods methods
...@@ -36,7 +38,7 @@ classdef Settings < handle ...@@ -36,7 +38,7 @@ classdef Settings < handle
% none % none
% outputs: % outputs:
% object:Settings - created object % object:Settings - created object
function object = Settings() function object = TTSettings()
end end
......
File moved