# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.4.3] - 2024-09-08

### Added

- CI jobs now run a dry run release to check for problems.

### Fixed

- Fixed examples to not include unused functions.

## [0.4.3] - 2024-09-07

### Fixed

- Fixed the file list in mix.exs to not include non-existent files.

## [0.4.2] - 2024-09-07

### Fixed

- Include dependency cache in release job so that publish works.

## [0.4.1] - 2024-09-07

### Fixed

- Fixed CI bug where hex wasn't pulled and so releases didn't make it to hex.pm.

## [0.4.0] - 2024-09-07

### Added

- `Ast.term/1` now supports the pin operator for pulling in external values and
  elixir expressions.
- Added `ExDoc` support.
- Telemetry has been added to the library:
  - A new module `Guesswork.Telemetry` holds a GenServer that tracks spans and
    metrics.
  - Queries now have their own struct that allow tracking of queries by id.
  - `Guesswork.Answer.Result.run/2` now reports a span that allows queries to be
    tracked and timed.
  - All assignments, substitutions, and tests are tracked (per query).
  - Unions are now tracked in spans.
  - A new example has been added to walk through this system.
- Simple benchmarks have been added to support telemetry operations.
- This project should now release to hex.pm and build a gitlab release on every
  merge to master.

### Fix

- Fixed bug where tests continued to be processed even after one failed.

## [0.3.0] - 2024-07-23

### Added

- `Ast.term/1` accepts entities other than atoms.
- Added support for a `one_of` operator that assigns a stream to a variable.
- Added support for an `is` operator that assigns computation.
- Falsehoods can now be added to collections.
- Added support for a `set` operator that assigns a value to a variable.
- Added a new, default, empty collection the `query/2` defaults to.
- `Result.new/2` has been renamed to `Result.run/2` for consistency with `Stream`.
- `Fact` now evaluates rules lazily in case there is a loop.
- New, high level tests have been added to verify the entire system.
- Added an example for pythagorean triples.

### Fixed

- Nots are now properly respected such that `l_not(l_and(set(x, 1), set(x, 2)))` is
  valid.
- Ands now evaluate their clauses such that infinite streams of answer sets can be
  properly evaluated.
- The macros used to define rules and terms now take functions instead of un-exported
  terms.

## [0.2.0] - 2024-06-27

### Added

- Added Credo linter.
- Added Dialyzer static analysis.
- Added a ci pipeline for MR quality control.
- Added a top level function for running queries.
- Added the classic family tree example.
- Added a `term/1` macro to make the process of making terms easier.
- Added implementations of `String.Chars` for all terms that mirrors the syntax
  of `term/1`.
- Knowledge bases have been generalized to use a behavior, which is taken advantage
  of with the new `Guesswork.KnowledgeBase.Collection` which makes it easy to create
  static collections of rules and facts.
- Add LICENSE.
- Added a new `Guesswork.Answer.Result` module that makes it easier to evaluate and
  display values on livebook.

### Fixed

- When facts are resolved they now search both for matching facts and matching
  rules.
- Variables now create an internal id that is used for comparison within answer
  sets so that separate variables with the same display name don't conflict.
- Fixed a bug in `And` where any repeating variable was seen as a conflict.
- `Statement.resolve/2` and `Guesswork.query/2` both return streams so that large
  problem spaces don't create issues.

## [0.1.0] - 2024-06-19

- init
