TPTP Problem File: COM002_20.p

View Solutions - Solve Problem

%------------------------------------------------------------------------------
% File     : COM002_20 : TPTP v9.0.0. Released v8.2.0.
% Domain   : Computing Theory
% Problem  : A program correctness theorem.
% Version  : COM002_2 with the conjecture removed
%            Theorem formulation : Considers failure rather than success
%            in the state space.
% English  : A computing state space, with eight states - P1 to P8.
%            P1 leads to P3 via P2. There is a branch at P3 such that the
%            following state is either P4 or P6. P6 leads to P8, which has
%            a loop back to P3, while P4 leads to termination. The problem
%            is to show that there is a loop in the computation, passing
%            through P3.

% Refs     : [RR+72] Reboh et al. (1972), Study of automatic theorem provin
% Source   : [TPTP]
% Names    : 

% Status   : Satisfiable
% Rating   : 0.00 v8.2.0
% Syntax   : Number of formulae    :   50 (  14 unt;  32 typ;   0 def)
%            Number of atoms       :   24 (   0 equ)
%            Maximal formula atoms :    3 (   1 avg)
%            Number of connectives :    9 (   3   ~;   1   |;   4   &)
%                                         (   0 <=>;   1  =>;   0  <=;   0 <~>)
%            Maximal formula depth :    7 (   2 avg)
%            Maximal term depth    :    3 (   1 avg)
%            Number of types       :    7 (   6 usr)
%            Number of type conns  :   19 (  10   >;   9   *;   0   +;   0  <<)
%            Number of predicates  :    4 (   4 usr;   0 prp; 2-2 aty)
%            Number of functors    :   22 (  22 usr;  16 con; 0-2 aty)
%            Number of variables   :   11 (  11   !;   0   ?;  11   :)
% SPC      : TF0_SAT_NEQ_NAR

% Comments : I suspect this problem was originally by R.M. Burstall.
%------------------------------------------------------------------------------
tff(state_type,type,
    state: $tType ).

tff(label_type,type,
    label: $tType ).

tff(statement_type,type,
    statement: $tType ).

tff(register_type,type,
    register: $tType ).

tff(number_type,type,
    number: $tType ).

tff(boolean_type,type,
    boolean: $tType ).

tff(p1_type,type,
    p1: state ).

tff(p2_type,type,
    p2: state ).

tff(p3_type,type,
    p3: state ).

tff(p4_type,type,
    p4: state ).

tff(p5_type,type,
    p5: state ).

tff(p6_type,type,
    p6: state ).

tff(p7_type,type,
    p7: state ).

tff(p8_type,type,
    p8: state ).

tff(n_type,type,
    n: number ).

tff(n0_type,type,
    n0: number ).

tff(n1_type,type,
    n1: number ).

tff(n2_type,type,
    n2: number ).

tff(register_j_type,type,
    register_j: register ).

tff(register_k_type,type,
    register_k: register ).

tff(out_type,type,
    out: label ).

tff(loop_type,type,
    loop: label ).

tff(equal_function_type,type,
    equal_function: ( register * number ) > boolean ).

tff(assign_type,type,
    assign: ( register * number ) > statement ).

tff(goto_type,type,
    goto: label > statement ).

tff(ifthen_type,type,
    ifthen: ( boolean * state ) > statement ).

tff(plus_type,type,
    plus: ( register * number ) > number ).

tff(times_type,type,
    times: ( number * register ) > number ).

tff(follows_type,type,
    follows: ( state * state ) > $o ).

tff(fails_type,type,
    fails: ( state * state ) > $o ).

tff(labels_type,type,
    labels: ( label * state ) > $o ).

tff(has_type,type,
    has: ( state * statement ) > $o ).

tff(direct_success,axiom,
    ! [Start_state: state,Goal_state: state] :
      ~ ( fails(Goal_state,Start_state)
        & follows(Goal_state,Start_state) ) ).

tff(transitivity_of_success,axiom,
    ! [Intermediate_state: state,Start_state: state,Goal_state: state] :
      ( fails(Goal_state,Start_state)
     => ( fails(Goal_state,Intermediate_state)
        | fails(Intermediate_state,Start_state) ) ) ).

tff(goto_success,axiom,
    ! [Label: label,Start_state: state,Goal_state: state] :
      ~ ( fails(Goal_state,Start_state)
        & has(Start_state,goto(Label))
        & labels(Label,Goal_state) ) ).

tff(conditional_success,axiom,
    ! [Condition: boolean,Start_state: state,Goal_state: state] :
      ~ ( fails(Goal_state,Start_state)
        & has(Start_state,ifthen(Condition,Goal_state)) ) ).

tff(state_1,hypothesis,
    has(p1,assign(register_j,n0)) ).

tff(transition_1_to_2,hypothesis,
    follows(p2,p1) ).

tff(state_2,hypothesis,
    has(p2,assign(register_k,n1)) ).

tff(label_state_3,hypothesis,
    labels(loop,p3) ).

tff(transition_2_to_3,hypothesis,
    follows(p3,p2) ).

tff(state_3,hypothesis,
    has(p3,ifthen(equal_function(register_j,n),p4)) ).

tff(state_4,hypothesis,
    has(p4,goto(out)) ).

tff(transition_4_to_5,hypothesis,
    follows(p5,p4) ).

tff(transition_3_to_6,hypothesis,
    follows(p6,p3) ).

tff(state_6,hypothesis,
    has(p6,assign(register_k,times(n2,register_k))) ).

tff(transition_6_to_7,hypothesis,
    follows(p7,p6) ).

tff(state_7,hypothesis,
    has(p7,assign(register_j,plus(register_j,n1))) ).

tff(transition_7_to_8,hypothesis,
    follows(p8,p7) ).

tff(state_8,hypothesis,
    has(p8,goto(loop)) ).

% tff(prove_there_is_a_loop_through_p3,conjecture,
%     ~ fails(p3,p3) ).

%------------------------------------------------------------------------------