# `mutations`

Experimental library. Should not be used in production code. Details can be changed without advance notice.

The `mutations` library provides support for generating random mutations of selected types. The library defines default mutation algorithms for the following basic types:

- `atom`

- `integer`

- `float`

- `compound`

- `list`

The user can add additional mutation algorithms for these or other types by defining objects or categories providing clauses for the `mutation/3` predicate and expanding the entity source files using the `mutations_store` object as the hook object.

This library is expected to eventually be used to support mutation-based fuzz testing.

By default, loading this library loads a set of default mutation algorithms. These can be overriden by defining alternative mutations and a custom loader file.

## API documentation

Open the ../../docs/library_index.html#mutations link in a web browser.

## Loading

To load all entities in this library, load the `loader.lgt` file:

    | ?- logtalk_load(mutations(loader)).

## Testing

To test this library predicates, load the `tester.lgt` file:

    | ?- logtalk_load(mutations(tester)).

## Usage

The `mutations` category complements the `type` object and thus its predicates are accessed via this object. For example:

    | ?- type::mutation(integer, 123, M).
    M = 1293
    yes

    | type::mutation(integer, 123, M).
    M = 5123
    yes

    | type::mutation(integer, 123, M).
    M = -123
    yes

    | type::mutation(integer, 123, M).
    M = 23
    yes

When there are multiple mutation algorithms for a given type, the predicate `type::mutation/3` choses one of them randomly. We can query the number of mutation algorithms available per type using the `mutations_store::counter/2` predicate:

    | ?- mutations_store::counter(Type, Count).
    Type = atom,
    Count = 6 ;
    Type = integer,
    Count = 7 ;
    ...

Loading this library also loads the `arbitrary` library, which provides `get_seed/1` and `set_seed/1` predicates that can be used to control the pseudo-random number generator.