5 releases

0.2.2 Oct 16, 2024
0.2.0 Sep 25, 2024
0.1.2 Jun 11, 2024
0.1.1 Feb 12, 2024
0.1.0 Feb 12, 2024

#285 in Concurrency

Download history 37/week @ 2024-07-27 151/week @ 2024-09-21 28/week @ 2024-09-28 4/week @ 2024-10-05 139/week @ 2024-10-12 18/week @ 2024-10-19 4/week @ 2024-11-02

162 downloads per month

MIT license

79KB
1.5K SLoC

Crates.io build workflow test workflow

fasb

Implementation of the faceted answer set browser, introduced in https://doi.org/10.1609/aaai.v36i5.20506.

fasb is a REPL system implemented on top of the clingo solver. It enables answer set navigation alongside quantitative reasoning.

fundamental concepts

weight of facet

The weight of a facet is the amount by which a specified quantity changes due to activating this facet. More on weights of facets can be found in https://doi.org/10.1609/aaai.v36i5.20506.

significance of a facet for a literal

To ask how significant a facet f is for a literal l, conceptionally, corresponds to asking how much information we gain (dually, uncertainty we reduce) among answer sets that satisfy l when filtering those answer sets that satisfy l and f. More on the notion of significance can be found in Navigating and Querying Answer Sets: How Hard Is It Really and Why? (to appear).

representative answer sets

fasb also implements a basic method for compressing a huge amount of answer sets into representative ones. More on representative answer sets can be found in https://ebooks.iospress.nl/doi/10.3233/FAIA230280.

quickstart

fasb as a REPL:

$ fasb program.lp 0
fasb v0.1.2
:: ! 2         -- enumerate up to 2 answer sets
solution 1:
a e
solution 2:
b d e
found 2
:: ?           -- query facets
b d c a
:: #!!         -- query weights based on answer set counting
0.3333 2 b     -- [reduces answer set count by] [remaining answer sets] [facet]
0.6667 1 d
0.3333 2 ~d
0.6667 1 c
0.3333 2 ~c
0.6667 1 a
0.3333 2 ~a
:: ' max#f     -- use facet-counting strictly goal-oriented mode 
:: $$          -- perform step (causing highest uncertainty reduction)
1.0000 0 d     -- activated facet `d` (reduced facet count by 100%)
:: @           -- query current route
d
:: !           -- enumerate all answer sets under current route
solution 1:
b d e
found 1
:: --          -- clear route
:: #!          -- query answer set count
3
:: > a|b&c|d   -- declare cnf query: (a or b) and (c or d)
:: >           -- clear query
:: % e ^*      -- compute significance of each current facet for literal e
 inc   exc
1.000 0.250 d
1.000 0.500 a
1.000 0.250 c
0.500 1.000 b
:: :q          --  quit

fasb as an interpreter:

$ cat script.fsb
! 1                  -- output 1 answer set
#?                   -- query facet count        
\ != #f 0 | $$ . ! 2 -- while condition | command . command
@                    -- display route                  
$ fasb program.lp 0 srcipt.fsb
fasb v0.1.2
:: ! 1
solution 1:
a e
found 1
:: #?
8
:: \ != #f 0 | $$ . ! 2
_ _ b
solution 1:
b d e
solution 2:
b c e
found 2
_ _ c
solution 1:
b c e
found 1
:: @
b c

install

  1. install cargo
  2. cargo install fasb

build

  1. install cargo
  2. cd fasb && cargo build -r

usage

fasb program [clingo flags] [script]

Apart from being a REPL system, fasb can also be used as an interpreter of instructions, which will be performed line by line. To use fasb as an interpreter add the feature flag --feature interpreter when installing or building. When using the interpreter, provide a script.

The designated syntax for regular expressions (regex) can be found here.

commands

  • \ condition | instructions ... loop '.' seperated instructions while condition={!=,<,<=,>,>=}\s^\d+$\s{#a,#f,#r} where
    • #a ... answer set count
    • #f ... facet count
    • #r ... size of current route
  • + args ... activate args=[whitespace seperated facets]
    • facet=[a|~a]
    • e.g.: activate +a and -b: + a ~b
  • > query ... declare cnf with |-seperated literals and &-seperated clauses
    • literal=[l|~l]
    • e.g.: > a|~b&~a|b
  • - ... deactivate previously activated facet
  • -- ... deactivate all facets
  • ? regex ... display current facets matching regex
  • @ ... query current route
  • ' arg ... select navigation mode arg=[{min,max}#{a,f}|go]
    • by default goal-oriented (go)
    • min* ... explore
    • max* ... strictly goal-oriented
    • *#a ... answer set counting
    • *#f ... facet counting
  • ! n ... enumerate n answer sets; if no n is provided, then all answer sets will be printed
  • % literal facets ... output significance of facets=[regex] for some literal=[a or ~a]
  • :! regex ... print representative answer sets regarding target atoms among facet-inducing atoms that match regex
  • #? ... query facet count
  • #! ... query answer set count
  • #?? regex ... query facet counts (weights) under each facets matching regex
  • #!! regex ... query answer set counts (weights) under each facets matching regex
  • :soe targets ... enumerate representative answer sets regarding targets=[regex] filtered from current facets
  • :src ... display underlying program
  • :atoms ... display atoms (herbrand base)
  • :isatom atom ... check whether atom belongs to herbrand base
  • man ... display brief manual
  • :q ... exit fasb

Dependencies

~20MB
~386K SLoC