TSTP Solution File: DAT100_1 by Princess---230619

View Problem - Process Solution

%------------------------------------------------------------------------------
% File     : Princess---230619
% Problem  : DAT100_1 : TPTP v8.1.2. Released v6.1.0.
% Transfm  : none
% Format   : tptp
% Command  : princess -inputFormat=tptp +threads -portfolio=casc +printProof -timeoutSec=%d %s

% Computer : n012.cluster.edu
% Model    : x86_64 x86_64
% CPU      : Intel(R) Xeon(R) CPU E5-2620 v4 2.10GHz
% Memory   : 8042.1875MB
% OS       : Linux 3.10.0-693.el7.x86_64
% CPULimit : 300s
% WCLimit  : 300s
% DateTime : Wed Aug 30 22:19:11 EDT 2023

% Result   : Theorem 4.52s 1.41s
% Output   : Proof 6.33s
% Verified : 
% SZS Type : -

% Comments : 
%------------------------------------------------------------------------------
%----WARNING: Could not form TPTP format derivation
%------------------------------------------------------------------------------
%----ORIGINAL SYSTEM OUTPUT
% 0.00/0.13  % Problem  : DAT100_1 : TPTP v8.1.2. Released v6.1.0.
% 0.00/0.14  % Command  : princess -inputFormat=tptp +threads -portfolio=casc +printProof -timeoutSec=%d %s
% 0.13/0.35  % Computer : n012.cluster.edu
% 0.13/0.35  % Model    : x86_64 x86_64
% 0.13/0.35  % CPU      : Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
% 0.13/0.35  % Memory   : 8042.1875MB
% 0.13/0.35  % OS       : Linux 3.10.0-693.el7.x86_64
% 0.13/0.35  % CPULimit : 300
% 0.13/0.35  % WCLimit  : 300
% 0.13/0.35  % DateTime : Thu Aug 24 14:09:27 EDT 2023
% 0.13/0.35  % CPUTime  : 
% 0.20/0.61  ________       _____
% 0.20/0.61  ___  __ \_________(_)________________________________
% 0.20/0.61  __  /_/ /_  ___/_  /__  __ \  ___/  _ \_  ___/_  ___/
% 0.20/0.61  _  ____/_  /   _  / _  / / / /__ /  __/(__  )_(__  )
% 0.20/0.61  /_/     /_/    /_/  /_/ /_/\___/ \___//____/ /____/
% 0.20/0.61  
% 0.20/0.61  A Theorem Prover for First-Order Logic modulo Linear Integer Arithmetic
% 0.20/0.61  (2023-06-19)
% 0.20/0.61  
% 0.20/0.61  (c) Philipp Rümmer, 2009-2023
% 0.20/0.61  Contributors: Peter Backeman, Peter Baumgartner, Angelo Brillout, Zafer Esen,
% 0.20/0.61                Amanda Stjerna.
% 0.20/0.61  Free software under BSD-3-Clause.
% 0.20/0.61  
% 0.20/0.61  For more information, visit http://www.philipp.ruemmer.org/princess.shtml
% 0.20/0.61  
% 0.20/0.62  Loading /export/starexec/sandbox2/benchmark/theBenchmark.p ...
% 0.20/0.63  Running up to 7 provers in parallel.
% 0.20/0.64  Prover 1: Options:  +triggersInConjecture -genTotalityAxioms -tightFunctionScopes -clausifier=none -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=maximal -realRatSaturationRounds=0 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=-1571432423
% 0.20/0.64  Prover 2: Options:  +triggersInConjecture +genTotalityAxioms -tightFunctionScopes -clausifier=simple +reverseFunctionalityPropagation +boolFunsAsPreds -triggerStrategy=allMinimalAndEmpty -realRatSaturationRounds=1 -ignoreQuantifiers -constructProofs=never -generateTriggers=all -randomSeed=-1065072994
% 0.20/0.64  Prover 0: Options:  +triggersInConjecture +genTotalityAxioms +tightFunctionScopes -clausifier=simple -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=allUni -realRatSaturationRounds=0 -ignoreQuantifiers -constructProofs=never -generateTriggers=all -randomSeed=1042961893
% 0.20/0.64  Prover 3: Options:  +triggersInConjecture -genTotalityAxioms -tightFunctionScopes -clausifier=none -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=maximal -realRatSaturationRounds=1 +ignoreQuantifiers -constructProofs=never -generateTriggers=all -randomSeed=1922548996
% 0.20/0.64  Prover 4: Options:  +triggersInConjecture -genTotalityAxioms -tightFunctionScopes -clausifier=simple -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=allUni -realRatSaturationRounds=0 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=1868514696
% 0.20/0.64  Prover 5: Options:  +triggersInConjecture -genTotalityAxioms +tightFunctionScopes -clausifier=none +reverseFunctionalityPropagation +boolFunsAsPreds -triggerStrategy=allMaximal -realRatSaturationRounds=1 -ignoreQuantifiers -constructProofs=never -generateTriggers=complete -randomSeed=1259561288
% 0.20/0.64  Prover 6: Options:  -triggersInConjecture -genTotalityAxioms +tightFunctionScopes -clausifier=none +reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=maximalOutermost -realRatSaturationRounds=0 -ignoreQuantifiers -constructProofs=never -generateTriggers=all -randomSeed=-1399714365
% 1.89/0.98  Prover 1: Preprocessing ...
% 1.89/0.99  Prover 4: Preprocessing ...
% 2.49/1.03  Prover 0: Preprocessing ...
% 2.49/1.03  Prover 3: Preprocessing ...
% 2.49/1.03  Prover 2: Preprocessing ...
% 2.49/1.03  Prover 5: Preprocessing ...
% 2.49/1.03  Prover 6: Preprocessing ...
% 3.68/1.18  Prover 5: Proving ...
% 3.75/1.19  Prover 0: Proving ...
% 3.75/1.19  Prover 6: Proving ...
% 3.75/1.19  Prover 3: Constructing countermodel ...
% 3.75/1.19  Prover 1: Constructing countermodel ...
% 3.75/1.20  Prover 4: Constructing countermodel ...
% 3.90/1.21  Prover 2: Proving ...
% 4.52/1.41  Prover 6: proved (766ms)
% 4.52/1.41  
% 4.52/1.41  % SZS status Theorem for /export/starexec/sandbox2/benchmark/theBenchmark.p
% 4.52/1.41  
% 4.52/1.41  Prover 3: stopped
% 4.52/1.41  Prover 2: stopped
% 4.52/1.41  Prover 0: stopped
% 4.52/1.41  Prover 5: stopped
% 4.52/1.41  Prover 7: Options:  +triggersInConjecture -genTotalityAxioms +tightFunctionScopes -clausifier=simple +reverseFunctionalityPropagation +boolFunsAsPreds -triggerStrategy=allUni -realRatSaturationRounds=1 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=-236303470
% 4.52/1.41  Prover 8: Options:  +triggersInConjecture +genTotalityAxioms -tightFunctionScopes -clausifier=none -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=maximal -realRatSaturationRounds=0 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=-200781089
% 4.52/1.41  Prover 10: Options:  +triggersInConjecture -genTotalityAxioms +tightFunctionScopes -clausifier=simple -reverseFunctionalityPropagation +boolFunsAsPreds -triggerStrategy=maximal -realRatSaturationRounds=1 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=919308125
% 4.52/1.41  Prover 11: Options:  +triggersInConjecture -genTotalityAxioms +tightFunctionScopes -clausifier=simple -reverseFunctionalityPropagation -boolFunsAsPreds -triggerStrategy=allUni -realRatSaturationRounds=1 +ignoreQuantifiers -constructProofs=always -generateTriggers=all -randomSeed=-1509710984
% 4.52/1.42  Prover 13: Options:  +triggersInConjecture -genTotalityAxioms -tightFunctionScopes -clausifier=simple -reverseFunctionalityPropagation +boolFunsAsPreds -triggerStrategy=maximal -realRatSaturationRounds=0 +ignoreQuantifiers -constructProofs=always -generateTriggers=complete -randomSeed=1138197443
% 4.52/1.44  Prover 11: Preprocessing ...
% 4.52/1.44  Prover 10: Preprocessing ...
% 5.51/1.44  Prover 13: Preprocessing ...
% 5.51/1.45  Prover 7: Preprocessing ...
% 5.51/1.46  Prover 8: Preprocessing ...
% 5.51/1.48  Prover 1: Found proof (size 30)
% 5.51/1.48  Prover 1: proved (846ms)
% 5.51/1.48  Prover 4: stopped
% 5.51/1.48  Prover 10: Warning: ignoring some quantifiers
% 5.51/1.49  Prover 10: Constructing countermodel ...
% 5.51/1.49  Prover 10: stopped
% 5.51/1.49  Prover 8: Warning: ignoring some quantifiers
% 5.51/1.50  Prover 8: Constructing countermodel ...
% 5.51/1.50  Prover 13: Warning: ignoring some quantifiers
% 5.51/1.50  Prover 7: Warning: ignoring some quantifiers
% 5.51/1.50  Prover 8: stopped
% 5.51/1.50  Prover 7: Constructing countermodel ...
% 5.51/1.50  Prover 13: Constructing countermodel ...
% 5.51/1.51  Prover 7: stopped
% 5.51/1.51  Prover 11: Constructing countermodel ...
% 5.51/1.51  Prover 13: stopped
% 5.51/1.51  Prover 11: stopped
% 5.51/1.51  
% 5.51/1.51  % SZS status Theorem for /export/starexec/sandbox2/benchmark/theBenchmark.p
% 5.51/1.51  
% 5.51/1.52  % SZS output start Proof for theBenchmark
% 5.51/1.52  Assumptions after simplification:
% 5.51/1.52  ---------------------------------
% 5.51/1.52  
% 5.51/1.52    (c)
% 6.07/1.54    list(nil) &  ? [v0: list] :  ? [v1: list] :  ? [v2: list] : (inRange(4, v2) =
% 6.07/1.54      0 & cons(5, v0) = v1 & cons(2, nil) = v0 & cons(1, v1) = v2 & list(v2) &
% 6.07/1.54      list(v1) & list(v0))
% 6.07/1.54  
% 6.07/1.54    (inRange)
% 6.07/1.55    list(nil) &  ! [v0: int] :  ! [v1: list] :  ! [v2: int] : (v2 = 0 |  ~
% 6.07/1.55      (inRange(v0, v1) = v2) |  ~ list(v1) | ( ~ (v1 = nil) &  ! [v3: int] :  !
% 6.07/1.55        [v4: list] : ( ~ ($lesseq(1, $difference(v0, v3))) |  ~ ($lesseq(0, v3)) |
% 6.07/1.55           ~ (cons(v3, v4) = v1) |  ~ list(v4) |  ? [v5: int] : ( ~ (v5 = 0) &
% 6.07/1.55            inRange(v0, v4) = v5)))) &  ! [v0: int] :  ! [v1: list] : (v1 = nil | 
% 6.07/1.55      ~ (inRange(v0, v1) = 0) |  ~ list(v1) |  ? [v2: int] :  ? [v3: list] :
% 6.07/1.55      ($lesseq(1, $difference(v0, v2)) & $lesseq(0, v2) & inRange(v0, v3) = 0 &
% 6.07/1.55        cons(v2, v3) = v1 & list(v3)))
% 6.07/1.55  
% 6.07/1.55    (l1)
% 6.07/1.55     ! [v0: int] :  ! [v1: list] :  ! [v2: list] : ( ~ (cons(v0, v1) = v2) |  ~
% 6.07/1.55      list(v1) | head(v2) = v0)
% 6.07/1.55  
% 6.07/1.55    (l2)
% 6.07/1.55     ! [v0: int] :  ! [v1: list] :  ! [v2: list] : ( ~ (cons(v0, v1) = v2) |  ~
% 6.07/1.55      list(v1) | tail(v2) = v1)
% 6.07/1.55  
% 6.07/1.55    (l4)
% 6.07/1.55    list(nil) &  ! [v0: int] :  ! [v1: list] : ( ~ (cons(v0, v1) = nil) |  ~
% 6.07/1.55      list(v1))
% 6.07/1.55  
% 6.07/1.55    (function-axioms)
% 6.07/1.55     ! [v0: MultipleValueBool] :  ! [v1: MultipleValueBool] :  ! [v2: list] :  !
% 6.07/1.55    [v3: int] : (v1 = v0 |  ~ (inRange(v3, v2) = v1) |  ~ (inRange(v3, v2) = v0))
% 6.07/1.55    &  ! [v0: list] :  ! [v1: list] :  ! [v2: list] :  ! [v3: int] : (v1 = v0 |  ~
% 6.07/1.55      (cons(v3, v2) = v1) |  ~ (cons(v3, v2) = v0)) &  ! [v0: list] :  ! [v1:
% 6.07/1.55      list] :  ! [v2: list] : (v1 = v0 |  ~ (tail(v2) = v1) |  ~ (tail(v2) = v0))
% 6.07/1.55    &  ! [v0: int] :  ! [v1: int] :  ! [v2: list] : (v1 = v0 |  ~ (head(v2) = v1)
% 6.07/1.55      |  ~ (head(v2) = v0))
% 6.07/1.55  
% 6.07/1.55  Further assumptions not needed in the proof:
% 6.07/1.55  --------------------------------------------
% 6.07/1.55  l3
% 6.07/1.55  
% 6.07/1.55  Those formulas are unsatisfiable:
% 6.07/1.55  ---------------------------------
% 6.07/1.55  
% 6.07/1.55  Begin of proof
% 6.07/1.56  | 
% 6.07/1.56  | ALPHA: (l4) implies:
% 6.07/1.56  |   (1)   ! [v0: int] :  ! [v1: list] : ( ~ (cons(v0, v1) = nil) |  ~ list(v1))
% 6.07/1.56  | 
% 6.07/1.56  | ALPHA: (inRange) implies:
% 6.07/1.56  |   (2)   ! [v0: int] :  ! [v1: list] : (v1 = nil |  ~ (inRange(v0, v1) = 0) | 
% 6.07/1.56  |          ~ list(v1) |  ? [v2: int] :  ? [v3: list] : ($lesseq(1,
% 6.07/1.56  |              $difference(v0, v2)) & $lesseq(0, v2) & inRange(v0, v3) = 0 &
% 6.07/1.56  |            cons(v2, v3) = v1 & list(v3)))
% 6.07/1.56  | 
% 6.07/1.56  | ALPHA: (c) implies:
% 6.07/1.56  |   (3)   ? [v0: list] :  ? [v1: list] :  ? [v2: list] : (inRange(4, v2) = 0 &
% 6.07/1.56  |          cons(5, v0) = v1 & cons(2, nil) = v0 & cons(1, v1) = v2 & list(v2) &
% 6.07/1.56  |          list(v1) & list(v0))
% 6.07/1.56  | 
% 6.07/1.56  | ALPHA: (function-axioms) implies:
% 6.07/1.56  |   (4)   ! [v0: int] :  ! [v1: int] :  ! [v2: list] : (v1 = v0 |  ~ (head(v2) =
% 6.07/1.56  |            v1) |  ~ (head(v2) = v0))
% 6.07/1.56  |   (5)   ! [v0: list] :  ! [v1: list] :  ! [v2: list] : (v1 = v0 |  ~ (tail(v2)
% 6.07/1.56  |            = v1) |  ~ (tail(v2) = v0))
% 6.07/1.56  | 
% 6.07/1.56  | DELTA: instantiating (3) with fresh symbols all_11_0, all_11_1, all_11_2
% 6.07/1.56  |        gives:
% 6.07/1.57  |   (6)  inRange(4, all_11_0) = 0 & cons(5, all_11_2) = all_11_1 & cons(2, nil)
% 6.07/1.57  |        = all_11_2 & cons(1, all_11_1) = all_11_0 & list(all_11_0) &
% 6.07/1.57  |        list(all_11_1) & list(all_11_2)
% 6.07/1.57  | 
% 6.07/1.57  | ALPHA: (6) implies:
% 6.07/1.57  |   (7)  list(all_11_2)
% 6.07/1.57  |   (8)  list(all_11_1)
% 6.07/1.57  |   (9)  list(all_11_0)
% 6.07/1.57  |   (10)  cons(1, all_11_1) = all_11_0
% 6.07/1.57  |   (11)  cons(5, all_11_2) = all_11_1
% 6.07/1.57  |   (12)  inRange(4, all_11_0) = 0
% 6.07/1.57  | 
% 6.07/1.57  | GROUND_INST: instantiating (l2) with 1, all_11_1, all_11_0, simplifying with
% 6.07/1.57  |              (8), (10) gives:
% 6.07/1.57  |   (13)  tail(all_11_0) = all_11_1
% 6.07/1.57  | 
% 6.07/1.57  | GROUND_INST: instantiating (l1) with 5, all_11_2, all_11_1, simplifying with
% 6.07/1.57  |              (7), (11) gives:
% 6.07/1.57  |   (14)  head(all_11_1) = 5
% 6.07/1.57  | 
% 6.07/1.57  | GROUND_INST: instantiating (2) with 4, all_11_0, simplifying with (9), (12)
% 6.07/1.57  |              gives:
% 6.07/1.57  |   (15)  all_11_0 = nil |  ? [v0: int] :  ? [v1: list] : ($lesseq(v0, 3) &
% 6.07/1.57  |           $lesseq(0, v0) & inRange(4, v1) = 0 & cons(v0, v1) = all_11_0 &
% 6.07/1.57  |           list(v1))
% 6.07/1.57  | 
% 6.07/1.57  | BETA: splitting (15) gives:
% 6.07/1.57  | 
% 6.07/1.57  | Case 1:
% 6.07/1.57  | | 
% 6.07/1.57  | |   (16)  all_11_0 = nil
% 6.07/1.57  | | 
% 6.07/1.57  | | REDUCE: (10), (16) imply:
% 6.07/1.57  | |   (17)  cons(1, all_11_1) = nil
% 6.07/1.57  | | 
% 6.07/1.57  | | GROUND_INST: instantiating (1) with 1, all_11_1, simplifying with (8), (17)
% 6.07/1.57  | |              gives:
% 6.07/1.58  | |   (18)  $false
% 6.07/1.58  | | 
% 6.07/1.58  | | CLOSE: (18) is inconsistent.
% 6.07/1.58  | | 
% 6.07/1.58  | Case 2:
% 6.07/1.58  | | 
% 6.07/1.58  | |   (19)   ? [v0: int] :  ? [v1: list] : ($lesseq(v0, 3) & $lesseq(0, v0) &
% 6.07/1.58  | |           inRange(4, v1) = 0 & cons(v0, v1) = all_11_0 & list(v1))
% 6.07/1.58  | | 
% 6.07/1.58  | | DELTA: instantiating (19) with fresh symbols all_26_0, all_26_1 gives:
% 6.33/1.58  | |   (20)  $lesseq(all_26_1, 3) & $lesseq(0, all_26_1) & inRange(4, all_26_0) =
% 6.33/1.58  | |         0 & cons(all_26_1, all_26_0) = all_11_0 & list(all_26_0)
% 6.33/1.58  | | 
% 6.33/1.58  | | ALPHA: (20) implies:
% 6.33/1.58  | |   (21)  list(all_26_0)
% 6.33/1.58  | |   (22)  cons(all_26_1, all_26_0) = all_11_0
% 6.33/1.58  | |   (23)  inRange(4, all_26_0) = 0
% 6.33/1.58  | | 
% 6.33/1.58  | | GROUND_INST: instantiating (l2) with all_26_1, all_26_0, all_11_0,
% 6.33/1.58  | |              simplifying with (21), (22) gives:
% 6.33/1.58  | |   (24)  tail(all_11_0) = all_26_0
% 6.33/1.58  | | 
% 6.33/1.58  | | GROUND_INST: instantiating (2) with 4, all_26_0, simplifying with (21), (23)
% 6.33/1.58  | |              gives:
% 6.33/1.58  | |   (25)  all_26_0 = nil |  ? [v0: int] :  ? [v1: list] : ($lesseq(v0, 3) &
% 6.33/1.58  | |           $lesseq(0, v0) & inRange(4, v1) = 0 & cons(v0, v1) = all_26_0 &
% 6.33/1.58  | |           list(v1))
% 6.33/1.58  | | 
% 6.33/1.58  | | GROUND_INST: instantiating (5) with all_11_1, all_26_0, all_11_0,
% 6.33/1.58  | |              simplifying with (13), (24) gives:
% 6.33/1.58  | |   (26)  all_26_0 = all_11_1
% 6.33/1.58  | | 
% 6.33/1.58  | | BETA: splitting (25) gives:
% 6.33/1.58  | | 
% 6.33/1.58  | | Case 1:
% 6.33/1.58  | | | 
% 6.33/1.58  | | |   (27)  all_26_0 = nil
% 6.33/1.58  | | | 
% 6.33/1.58  | | | COMBINE_EQS: (26), (27) imply:
% 6.33/1.58  | | |   (28)  all_11_1 = nil
% 6.33/1.58  | | | 
% 6.33/1.58  | | | REDUCE: (11), (28) imply:
% 6.33/1.58  | | |   (29)  cons(5, all_11_2) = nil
% 6.33/1.58  | | | 
% 6.33/1.58  | | | GROUND_INST: instantiating (1) with 5, all_11_2, simplifying with (7),
% 6.33/1.58  | | |              (29) gives:
% 6.33/1.58  | | |   (30)  $false
% 6.33/1.58  | | | 
% 6.33/1.58  | | | CLOSE: (30) is inconsistent.
% 6.33/1.58  | | | 
% 6.33/1.58  | | Case 2:
% 6.33/1.58  | | | 
% 6.33/1.58  | | |   (31)   ? [v0: int] :  ? [v1: list] : ($lesseq(v0, 3) & $lesseq(0, v0) &
% 6.33/1.58  | | |           inRange(4, v1) = 0 & cons(v0, v1) = all_26_0 & list(v1))
% 6.33/1.58  | | | 
% 6.33/1.58  | | | DELTA: instantiating (31) with fresh symbols all_49_0, all_49_1 gives:
% 6.33/1.59  | | |   (32)  $lesseq(all_49_1, 3) & $lesseq(0, all_49_1) & inRange(4, all_49_0)
% 6.33/1.59  | | |         = 0 & cons(all_49_1, all_49_0) = all_26_0 & list(all_49_0)
% 6.33/1.59  | | | 
% 6.33/1.59  | | | ALPHA: (32) implies:
% 6.33/1.59  | | |   (33)  $lesseq(all_49_1, 3)
% 6.33/1.59  | | |   (34)  list(all_49_0)
% 6.33/1.59  | | |   (35)  cons(all_49_1, all_49_0) = all_26_0
% 6.33/1.59  | | | 
% 6.33/1.59  | | | REDUCE: (26), (35) imply:
% 6.33/1.59  | | |   (36)  cons(all_49_1, all_49_0) = all_11_1
% 6.33/1.59  | | | 
% 6.33/1.59  | | | GROUND_INST: instantiating (l1) with all_49_1, all_49_0, all_11_1,
% 6.33/1.59  | | |              simplifying with (34), (36) gives:
% 6.33/1.59  | | |   (37)  head(all_11_1) = all_49_1
% 6.33/1.59  | | | 
% 6.33/1.59  | | | GROUND_INST: instantiating (4) with 5, all_49_1, all_11_1, simplifying
% 6.33/1.59  | | |              with (14), (37) gives:
% 6.33/1.59  | | |   (38)  all_49_1 = 5
% 6.33/1.59  | | | 
% 6.33/1.59  | | | REDUCE: (33), (38) imply:
% 6.33/1.59  | | |   (39)  $false
% 6.33/1.59  | | | 
% 6.33/1.59  | | | CLOSE: (39) is inconsistent.
% 6.33/1.59  | | | 
% 6.33/1.59  | | End of split
% 6.33/1.59  | | 
% 6.33/1.59  | End of split
% 6.33/1.59  | 
% 6.33/1.59  End of proof
% 6.33/1.59  % SZS output end Proof for theBenchmark
% 6.33/1.59  
% 6.33/1.59  973ms
%------------------------------------------------------------------------------