Properties which are native to analyzers

Author(s): Francisco Bueno, Manuel Hermenegildo, Pedro López, Edison Mera, Amadeo Casas.

This library contains a set of properties which are natively understood by the different program analyzers of ciaopp. They are used by ciaopp on output and they can also be used as properties in assertions.

Documentation on exports

PROPERTY

Usage:compat(Prop)

Use Prop as a compatibility property. Normally used with types. See the discussion in Declaring regular types.

  • The following properties should hold globally:
    (basic_props:no_rtcheck/1)compat(Prop) is not checked during run-time checking.
Meta-predicate with arguments: compat(goal).

PROPERTY

Usage:instance(Prop)

Use Prop as an instantiation property. Normally used with types. See the discussion in Declaring regular types.

  • The following properties should hold globally:
    (basic_props:no_rtcheck/1)instance(Prop) is not checked during run-time checking.
Meta-predicate with arguments: instance(goal).

PROPERTY
mshare(X)

X contains all sharing sets [JL88,MH89] which specify the possible variable occurrences in the terms to which the variables involved in the clause may be bound. Sharing sets are a compact way of representing groundness of variables and dependencies between variables. This representation is however generally difficult to read for humans. For this reason, this information is often translated to ground/1, indep/1 and indep/2 properties, which are easier to read.

Usage:mshare(X)

The sharing pattern for the variables in the clause is X.

  • The following properties should hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as sharing(X).
    (basic_props:no_rtcheck/1)mshare(X) is not checked during run-time checking.
General properties:

Test:mshare(L)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:L=[[A],[p(A)]]
    then the following properties should hold globally:
    (native_props:fails/1)Calls of the form mshare(L) fail.

Test:mshare(L)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:L=[[A],[p(B)]]
    then the following properties should hold globally:
    (native_props:not_fails/1)All the calls of the form mshare(L) do not fail.

PROPERTY

(True) Usage:indep(X,Y)

X and Y do not have variables in common.

  • The following properties hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as indep([[X,Y]]).

PROPERTY

(True) Usage:indep(X)

The variables in the the pairs in X are pairwise independent.

  • The following properties hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as indep(X).

PROPERTY
covered(X,Y)

All variables occuring in X occur also in Y. Used by the non-strict independence-based annotators.

(True) Usage:covered(X,Y)

X is covered by Y.

  • The following properties hold globally:
    (basic_props:native/1)This predicate is understood natively by CiaoPP.

PROPERTY
linear(X)

X is bound to a term which is linear, i.e., if it contains any variables, such variables appear only once in the term. For example, [1,2,3] and f(A,B) are linear terms, while f(A,A) is not.

(True) Usage:linear(X)

X is instantiated to a linear term.

  • The following properties hold globally:
    (basic_props:native/1)This predicate is understood natively by CiaoPP.

PROPERTY

Usage:nonground(X)

X is not ground.

  • The following properties should hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as not_ground(X).

PROPERTY
clique(X)

X is a set of variables of interest, much the same as a sharing group but X represents all the sharing groups in the powerset of those variables. Similar to a sharing group, a clique is often translated to ground/1, indep/1, and indep/2 properties.

Usage:clique(X)

The clique sharing pattern is X.

  • The following properties should hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as clique(X).
    (basic_props:no_rtcheck/1)clique(X) is not checked during run-time checking.

PROPERTY
clique_1(X)

X is a set of variables of interest, much the same as a sharing group but X represents all the sharing groups in the powerset of those variables but disregarding the singletons. Similar to a sharing group, a clique_1 is often translated to ground/1, indep/1, and indep/2 properties.

Usage:clique_1(X)

The 1-clique sharing pattern is X.

  • The following properties should hold globally:
    (basic_props:native/2)This predicate is understood natively by CiaoPP as clique_1(X).
    (basic_props:no_rtcheck/1)clique_1(X) is not checked during run-time checking.

PROPERTY
is_det(X)

All calls of the form X are deterministic, i.e., produce at most one solution (or do not terminate). In other words, if X succeeds, it can only succeed once. It can still leave choice points after its execution, but when backtracking into these, it can only fail or go into an infinite loop. This property is inferred and checked natively by CiaoPP using the domains and techniques of [LGBH05,LGBH10].

Usage:is_det(X)

All calls of the form X are deterministic.

    Meta-predicate with arguments: is_det(goal).

    PROPERTY
    non_det(X)

    All calls of the form X are non-deterministic, i.e., they always produce more than one solution.

    Usage:non_det(X)

    All calls of the form X are non-deterministic.

      Meta-predicate with arguments: non_det(goal).

      PROPERTY
      possibly_nondet(X)

      Non-determinism is not ensured for calls of the form X. In other words, nothing can be ensured about determinacy of such calls. This is the default when no information is given for a predicate, so this property does not need to be stated explicitly.

      Usage:possibly_nondet(X)

      Non-determinism is not ensured for calls of the form X.

      • The following properties should hold globally:
        (basic_props:no_rtcheck/1)possibly_nondet(X) is not checked during run-time checking.

      PROPERTY
      mut_exclusive(X)

      For any call of the form X at most one clause succeeds, i.e., clauses are pairwise exclusive. Note that determinacy is the transitive closure (to all called predicates) of this property. This property is inferred and checked natively by CiaoPP using the domains and techniques of [LGBH05,LGBH10].

      Usage:mut_exclusive(X)

      For any call of the form X at most one clause succeeds.

      • The following properties should hold globally:
        (basic_props:rtcheck/2)The runtime check of this property is unimplemented.
      Meta-predicate with arguments: mut_exclusive(goal).

      PROPERTY
      not_mut_exclusive(X)

      For calls of the form X more than one clause may succeed. I.e., clauses are not disjoint for some call.

      Usage:not_mut_exclusive(X)

      For some calls of the form X more than one clause may succeed.

      • The following properties should hold globally:
        (basic_props:rtcheck/2)The runtime check of this property is unimplemented.
      Meta-predicate with arguments: not_mut_exclusive(goal).

      PROPERTY
      possibly_not_mut_exclusive(X)

      Mutual exclusion of the clauses for calls of the form X cannot be ensured. This is the default when no information is given for a predicate, so this property does not need to be stated explicitly.

      Usage:possibly_not_mut_exclusive(X)

      Mutual exclusion is not ensured for calls of the form X.

      • The following properties should hold globally:
        (basic_props:no_rtcheck/1)possibly_not_mut_exclusive(X) is not checked during run-time checking.
      Meta-predicate with arguments: possibly_not_mut_exclusive(goal).

      PROPERTY
      not_fails(X)

      Calls of the form X produce at least one solution (succeed), or do not terminate. This property is inferred and checked natively by CiaoPP using the domains and techniques of [DLGH97,BLGH04].

      (True) Usage:not_fails(X)

      All the calls of the form X do not fail.

      • The following properties hold globally:
        (basic_props:native/1)This predicate is understood natively by CiaoPP.
      Meta-predicate with arguments: not_fails(goal).

      PROPERTY

      Usage:succeeds(Prop)

      A call to Prop succeeds.

      • The following properties should hold globally:
        (basic_props:no_rtcheck/1)succeeds(Prop) is not checked during run-time checking.
      Meta-predicate with arguments: succeeds(goal).

      PROPERTY
      fails(X)

      Calls of the form X fail.

      (True) Usage:fails(X)

      Calls of the form X fail.

      • The following properties hold globally:
        (basic_props:native/1)This predicate is understood natively by CiaoPP.
      Meta-predicate with arguments: fails(goal).

      PROPERTY
      possibly_fails(X)

      Non-failure is not ensured for any call of the form X. In other words, nothing can be ensured about non-failure nor termination of such calls.

      Usage:possibly_fails(X)

      Non-failure is not ensured for calls of the form X.

      • The following properties should hold globally:
        (basic_props:no_rtcheck/1)possibly_fails(X) is not checked during run-time checking.
      Meta-predicate with arguments: possibly_fails(goal).

      PROPERTY
      covered(X)

      For any call of the form X there is at least one clause whose test (guard) succeeds (i.e., all the calls of the form X are covered). Note that nonfailure is the transitive closure (to all called predicates) of this property. [DLGH97,BLGH04].

      Usage:covered(X)

      All the calls of the form X are covered.

      • The following properties should hold globally:
        (basic_props:rtcheck/2)The runtime check of this property is unimplemented.

      PROPERTY
      not_covered(X)

      There is some call of the form X for which there is no clause whose test succeeds [DLGH97].

      Usage:not_covered(X)

      Not all of the calls of the form X are covered.

      • The following properties should hold globally:
        (basic_props:rtcheck/2)The runtime check of this property is unimplemented.

      PROPERTY
      possibly_not_covered(X)

      Covering is not ensured for any call of the form X. In other words, nothing can be ensured about covering of such calls.

      Usage:possibly_not_covered(X)

      Covering is not ensured for calls of the form X.

      • The following properties should hold globally:
        (basic_props:no_rtcheck/1)possibly_not_covered(X) is not checked during run-time checking.
      Meta-predicate with arguments: possibly_not_covered(goal).

      PROPERTY

      Usage:test_type(X,T)

      Indicates the type of test that a predicate performs. Required by the nonfailure analyisis.

        Meta-predicate with arguments: test_type(goal,?).

        PROPERTY

        Usage 1:num_solutions(X,N)

        Calls of the form X have N solutions, i.e., N is the cardinality of the solution set of X.

        • If the following properties should hold at call time:
          (basic_props:callable/1)X is a term which represents a goal, i.e., an atom or a structure.
          (basic_props:int/1)N is an integer.

        Usage 2:num_solutions(Goal,Check)

        For a call to Goal, Check(X) succeeds, where X is the number of solutions.

        • If the following properties should hold at call time:
          (basic_props:callable/1)Goal is a term which represents a goal, i.e., an atom or a structure.
          (basic_props:callable/1)Check is a term which represents a goal, i.e., an atom or a structure.

        PROPERTY
        relations(X,N)

        Calls of the form produce N solutions, i.e., N is the cardinality of the solution set of X.

        Usage:relations(X,N)

        Goal X produces N solutions.

        • If the following properties should hold at call time:
          (basic_props:callable/1)X is a term which represents a goal, i.e., an atom or a structure.
          (basic_props:int/1)N is an integer.
          then the following properties should hold globally:
          (basic_props:rtcheck/2)The runtime check of this property is unimplemented.
        Meta-predicate with arguments: relations(goal,?).

        PROPERTY
        finite_solutions(X)

        Calls of the form X produce a finite number of solutions [DLGH97].

        Usage:finite_solutions(X)

        All the calls of the form X have a finite number of solutions.

        • The following properties should hold globally:
          (basic_props:no_rtcheck/1)finite_solutions(X) is not checked during run-time checking.
        Meta-predicate with arguments: finite_solutions(goal).

        PROPERTY

        Usage:solutions(Goal,Sols)

        Goal Goal produces the solutions listed in Sols.

        • If the following properties should hold at call time:
          (basic_props:callable/1)Goal is a term which represents a goal, i.e., an atom or a structure.
          (basic_props:list/1)Sols is a list.

        PROPERTY

        Usage:no_choicepoints(X)

        A call to X does not leave new choicepoints.

          Meta-predicate with arguments: no_choicepoints(goal).

          PROPERTY

          Usage:leaves_choicepoints(X)

          A call to X leaves new choicepoints.

            Meta-predicate with arguments: leaves_choicepoints(goal).

            PROPERTY

            Usage:size(X,Y)

            Y is the size of argument X, for any approximation.

            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size(X,Y) is not checked during run-time checking.

            PROPERTY

            Usage:size(A,X,Y)

            Y is the size of argument X, for the approximation A.

            • If the following properties should hold at call time:
              (native_props:bound/1)A is a direction of approximation (upper or lower bound).
              then the following properties should hold globally:
              (basic_props:no_rtcheck/1)size(A,X,Y) is not checked during run-time checking.

            PROPERTY
            size_lb(X,Y)

            The minimum size of the terms to which the argument Y is bound is given by the expression Y. Various measures can be used to determine the size of an argument, e.g., list-length, term-size, term-depth, integer-value, etc. [DL93,LGHD96]. See measure_t/1.

            Usage:size_lb(X,Y)

            Y is a lower bound on the size of argument X.

            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size_lb(X,Y) is not checked during run-time checking.

            PROPERTY
            size_ub(X,Y)

            The maximum size of the terms to which the argument Y is bound is given by the expression Y. Various measures can be used to determine the size of an argument, e.g., list-length, term-size, term-depth, integer-value, etc. [DL93,LGHD96]. See measure_t/1.

            Usage:size_ub(X,Y)

            Y is a upper bound on the size of argument X.

            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size_ub(X,Y) is not checked during run-time checking.

            PROPERTY

            Usage:size_o(X,Y)

            The size of argument X is in the order of the expression Y.

            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size_o(X,Y) is not checked during run-time checking.

            PROPERTY

            Usage:size_metric(Head,Var,Metric)

            Metric is the measure used to determine the size of the terms that Var is bound to, for any type of approximation.

            • Call and exit should be compatible with:
              (native_props:measure_t/1)Metric is a term size metric.
            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size_metric(Head,Var,Metric) is not checked during run-time checking.
            Meta-predicate with arguments: size_metric(goal,?,?).

            PROPERTY

            Usage:size_metric(Head,Approx,Var,Metric)

            Metric is the measure used to determine the size of the terms that variable Var bound to, for the approximation Approx.

            • Call and exit should be compatible with:
              (native_props:bound/1)Approx is a direction of approximation (upper or lower bound).
              (native_props:measure_t/1)Metric is a term size metric.
            • The following properties should hold globally:
              (basic_props:no_rtcheck/1)size_metric(Head,Approx,Var,Metric) is not checked during run-time checking.
            Meta-predicate with arguments: size_metric(goal,?,?,?).

            REGTYPE
            The types of term size measures currently supported in size and cost analysis (see also in resources_basic.pl).

            • int: The size of the term (which is an integer) is the integer value itself.

            • length: The size of the term (which is a list) is its length.

            • size: The size is the overall of the term (number of subterms).

            • depth([_|_]): The size of the term is its depth.

              %% The size of the term is the number of rule %% applications of its type definition.

            • void: Used to indicate that the size of this argument should be ignored.

            Usage:measure_t(X)

            X is a term size metric.

              REGTYPE
              The types approximation (bounding) supported in size and cost analysis (see also resources_basic.pl).

              • upper: an upper bound.

              • lower: a lower bound.

              Usage:bound(X)

              X is a direction of approximation (upper or lower bound).

                PROPERTY
                steps(X,Y)

                The computation (in resolution steps) spent by any call of the form X is given by the expression Y

                Usage:steps(X,Y)

                Y is the cost (number of resolution steps) of any call of the form X.

                • The following properties should hold globally:
                  (basic_props:no_rtcheck/1)steps(X,Y) is not checked during run-time checking.
                Meta-predicate with arguments: steps(goal,?).

                PROPERTY
                steps_lb(X,Y)

                The minimum computation (in resolution steps) spent by any call of the form X is given by the expression Y [DLGHL97,LGHD96]

                Usage:steps_lb(X,Y)

                Y is a lower bound on the cost of any call of the form X.

                • The following properties should hold globally:
                  (basic_props:no_rtcheck/1)steps_lb(X,Y) is not checked during run-time checking.
                Meta-predicate with arguments: steps_lb(goal,?).

                PROPERTY

                Usage:steps_o(X,Y)

                Y is the complexity order of the cost of any call of the form X.

                • The following properties should hold globally:
                  (basic_props:no_rtcheck/1)steps_o(X,Y) is not checked during run-time checking.
                Meta-predicate with arguments: steps_o(goal,?).

                PROPERTY
                steps_ub(X,Y)

                The maximum computation (in resolution steps) spent by any call of the form X is given by the expression Y [DL93,LGHD96].

                Usage:steps_ub(X,Y)

                Y is a upper bound on the cost of any call of the form X.

                • The following properties should hold globally:
                  (basic_props:no_rtcheck/1)steps_ub(X,Y) is not checked during run-time checking.
                Meta-predicate with arguments: steps_ub(goal,?).

                PROPERTY
                terminates(X)

                Calls of the form X always terminate.

                Usage:terminates(X)

                All calls of the form X terminate.

                • The following properties should hold globally:
                  (basic_props:no_rtcheck/1)terminates(X) is not checked during run-time checking.
                Meta-predicate with arguments: terminates(goal).

                PROPERTY

                Usage:exception(Goal)

                Calls of the form Goal will throw an (unspecified) exception.

                  Meta-predicate with arguments: exception(goal).

                  PROPERTY

                  Usage:exception(Goal,E)

                  Calls to Goal will throw an exception that unifies with E.

                    Meta-predicate with arguments: exception(goal,?).

                    PROPERTY

                    Usage:possible_exceptions(Goal,Es)

                    Calls of the form Goal may throw exceptions, but only the ones that unify with the terms listed in Es.

                    • If the following properties should hold at call time:
                      (basic_props:list/1)Es is a list.
                      then the following properties should hold globally:
                      (basic_props:rtcheck/2)The runtime check of this property is unimplemented.
                    Meta-predicate with arguments: possible_exceptions(goal,?).

                    PROPERTY

                    Usage:no_exception(Goal)

                    Calls of the form Goal do not throw any exception.

                      Meta-predicate with arguments: no_exception(goal).

                      PROPERTY

                      Usage:no_exception(Goal,E)

                      Calls of the form Goal do not throw any exception that unifies with E.

                        Meta-predicate with arguments: no_exception(goal,?).

                        PROPERTY

                        Usage:signal(Goal)

                        Calls to Goal will send an (unspecified) signal.

                          Meta-predicate with arguments: signal(goal).

                          PROPERTY

                          Usage:signal(Goal,E)

                          Calls to Goal will send a signal that unifies with E.

                            Meta-predicate with arguments: signal(goal,?).

                            PROPERTY

                            Usage:possible_signals(Goal,Es)

                            Calls of the form Goal may generate signals, but only the ones that unify with the terms listed in Es.

                            • The following properties should hold globally:
                              (basic_props:rtcheck/2)The runtime check of this property is unimplemented.
                            Meta-predicate with arguments: possible_signals(goal,?).

                            PROPERTY

                            Usage:no_signal(Goal)

                            Calls of the form Goal do not send any signal.

                              Meta-predicate with arguments: no_signal(goal).

                              PROPERTY

                              Usage:no_signal(Goal,E)

                              Calls of the form Goal do not send any signals that unify with E.

                                Meta-predicate with arguments: no_signal(goal,?).

                                PROPERTY

                                Usage:sideff_hard(X)

                                X has hard side-effects, i.e., those that might affect program execution (e.g., assert/retract).

                                • The following properties should hold globally:
                                  (basic_props:no_rtcheck/1)sideff_hard(X) is not checked during run-time checking.
                                Meta-predicate with arguments: sideff_hard(goal).

                                PROPERTY

                                Usage:sideff_pure(X)

                                X is pure, i.e., has no side-effects.

                                • The following properties should hold globally:
                                  (basic_props:no_rtcheck/1)sideff_pure(X) is not checked during run-time checking.
                                Meta-predicate with arguments: sideff_pure(goal).

                                PROPERTY

                                Usage:sideff_soft(X)

                                X has soft side-effects, i.e., those not affecting program execution (e.g., input/output).

                                • The following properties should hold globally:
                                  (basic_props:no_rtcheck/1)sideff_soft(X) is not checked during run-time checking.
                                Meta-predicate with arguments: sideff_soft(goal).

                                PROPERTY
                                constraint(C)

                                C contains a list of linear (in)equalities that relate variables and int values. For example, [A < B + 4] is a constraint while [A < BC + 4] or [A = 3.4, B >= C] are not. Used by polyhedra-based analyses.

                                (True) Usage:constraint(C)

                                C is a list of linear equations.

                                • The following properties hold globally:
                                  (basic_props:native/1)This predicate is understood natively by CiaoPP.

                                PROPERTY
                                tau(Types)

                                Types contains a list with the type associations for each variable, in the form V/[T1,..,TN]. Note that tau is used in object-oriented programs only

                                (True) Usage:tau(TypeInfo)

                                Types is a list of associations between variables and list of types

                                • The following properties hold globally:
                                  (basic_props:native/1)This predicate is understood natively by CiaoPP.

                                PROPERTY

                                Usage:user_output(Goal,S)

                                Calls of the form Goal write S to standard output.

                                  Meta-predicate with arguments: user_output(goal,?).

                                  PROPERTY

                                  (True) Usage:instance(Term1,Term2)

                                  Term1 is an instance of Term2.

                                  • The following properties hold globally:
                                    (basic_props:native/1)This predicate is understood natively by CiaoPP.

                                  Known bugs and planned improvements

                                  • MH: The implementations for run-time checking, unless they are straightforward should be in the run-time check library and here they should just just be declared implementation_defibned. This file should be more about documentation, and providing definitions for the assertions when used by CiaoPP.
                                  • MH: Some of these properties should be moved to rtchecks or testing libs.
                                  • MH: Missing test cases and examples.
                                  • MH: Also defined (much better) in basic_props!!
                                  • MH: The idea was to call it inst/2 (to avoid confusion with instace/2). Note that it is also defiend --this way-- in basic_props!!
                                  • MH: inst/1 not really needed since it is the default?
                                  • MH: Note that instance/2 is reexported above!
                                  • This is the same as num_solutions/2!
                                  • size/3 vs. size_ub, size_lb redundant...
                                  • Should probably find a better name...
                                  • Still missing other side effects such as dynamic predicates, mutables, I/O, etc.
                                  • These need to be unified with the sideff(pure) ones!
                                  • Needs reorganization...
                                  • Should be in unittest_props library?
                                  • MH: not really clear why this should be here.