|Did you know ...||Search Documentation:|
|Packs (add-ons) for SWI-Prolog|
|Title:||Goal directed ASP solver|
|Rating:||Not rated. Create the first rating!|
|Author:||Jan Wielemaker <email@example.com>|
|Joaquin Arias <firstname.lastname@example.org>|
No reviews. Create the first review!.
s(CASP) port for SWI-Prolog is no longer in an experimental state
and therefore this repository is moved to the SWI-Prolog
organization. After moving, the
master branch from where the porting work started has been renamed to
ciao and the
swipl branch has become
This repository is now archived.
This is a fork from https://gitlab.software.imdea.org/ciao-lang/sCASP. It provides a port of
s(CASP)to SWI-Prolog in the branch
The SWI-Prolog port is fully functional and from the solver prespective fully compatible with the Ciao original. The SWI-Prolog port provides two significant optimizations: (1) a more low level implementation for the term copying required for forall constructs that result from dual rules for clauses that introduce variables in the body as well as for global constraint and (2) an index to speedup finding loops and already proved literals. This often leads to about 10 times better performance.
Running requires SWI-Prolog 8.5.6 or later. The
can be build on POSIX systems by running
make in the toplevel of the
sCASP directory. On Windows
bindirectory of SWI-Prolog to
%PATH%, so you can run
swipl.exeand the swipl DLLs can be found.
swipl.exe --no-pce --undefined=error -O -o scasp -c prolog/scasp/main.pl
The command line arguments are similar, but with small differences due
to the use of SWI-Prolog's commandline parser. Run
scasp -h for details.
The output is different, using Unicode and, if possible, color to simplify
reading the model and justification.
Next to using the
s(CASP) can be used as a library.
For this, activate the sCASP directory as a SWI-Prolog add on by
starting SWI-Prolog in the top directory and run
Now you can load scasp using
s(CASP) queries take a normal Prolog program that can be made
available in the usual way: by consulting a file, asserting, etc. The
program must respect the sCASP restrictions. Using any built-in or
control structure that is not known to
s(CASP) results in an error.
From the toplevel REPL loop,
s(CASP) queries are executed by prefixing
them with one of the 7 operators below.
|?--||Prove and only show the bindings|
|?+-||Prove, show bindings and model|
|?-+||Prove, show bindings and justification (tree)|
|?++||Prove, show bindings model and justification)|
|??+-||As above, but using human language output|
? and ?? are backward compatible aliases for ?+- and ?++. For example, this shows the model.
?- ? p(X).
The predicate scasp/2 can be used to get access to the model and tree to reason about them. For example, this returns the model as a list of terms and the justification as a tree structure.
?- scasp(goal(X), [model(M), tree(T)]).
s(CASP) can also be used in your browser using
Finally, there is a simple web
server. This server can also be
deployed locally using the command below. Add
-h for options.
The web server lets you post
s(CASP) programs and get their results as
HTML or JSON. See Help for
s(CASP) system is a top-down interpreter for ASP programs with
And extended description of the justification trees was presented at ICLP'20 (Arias et al. 2020).
s(CASP) by [Joaquin Arias](mailto:email@example.com), is based on
s(CASP) is an implementation of the stable model semantics of
constraint logic programming. Unlike similar systems, it does not
employ any form of grounding. This allows
s(CASP) to execute programs
that are not finitely groundable, including those which make use of
lists and terms.
scasp [options] InputFile(s)
-h, -?, --help Print this help message and terminate. --help_all Print extended help. -i, --interactive Run in interactive mode (REP loop). -a, --auto Run in batch mode (no user interaction). -sN, -nN Compute N answer sets, where N >= 0. N = 0 means 'all'. -d, --plaindual Generate dual program with single-goal clauses (for propositional programs). -r[=d] Output rational numbers as real numbers. [d] determines precision. Defaults to d = 5. --code Print program with dual clauses and exit. --tree Print justification tree for each answer (if any). --plain Output code / justification tree as literals (default). --human Output code / justification tree in natural language. --long Output long version of justification. --mid Output mid-sized version of justification (default) . --short Short version of justification. --pos Only display the selected literals in the justification. --neg Add the negated literals in the justification (default). --html[=name] Generate HTML file for the justification. [name]: use 'name.html'. Default: first InputFile name. -v, --verbose Enable verbose progress messages. -f, --tracefails Trace user-predicate failures. --update Automatically update s(CASP). --version Output the current version of s(CASP) --all_c_forall Exhaustive evaluation of c_forall/2. --prev_forall Deprecated evaluation of forall/2.
Let us consider the program
p(A) :- not q(A). q(A) :- not p(A). ?- p(A).
$ scasp test.pl Answer 1 (in 0.09 ms): p(A) , not q(A) ? ;
for this example there is only one model so when we ask for more models (introducing
; after the
?) the evaluation finishes.
$ scasp -s0 test.pl
$ scasp -s5 test.pl
-i, and introduce the query after
$ scasp -i test.pl ?- q(A). Answer 1 (in 0.228 ms): q(A) , not p(A) ?
$ scasp --code test.pl
$ scasp --tree test.pl
To generate the code/justification tree in English use `--human` and to control which literals should appear check the instructions in the following paper: (Arias et al. 2020).
There are some examples, most of them available in the distribution of
s(ASP). Check them [here](examples/) and in your local installation
(the default folder is `~/.ciao/sCASP`).
s(CASP) vs Clingo standard vs Clingo incremental.
See more details here.
Let us assume that we deal with series of data items, some of which
may be contradictory. Moreover, different sources may give data a
different degree of trustworthiness which can make some pieces of
inconsistent data to be preferred. Lets us assume that
are contradictory and we receive, from source S1,
p(A) and, from
q(a). We may decide that: (i)
p(A) is true because S1 is
more realiable; (ii) or if S2 is more realiable,
q(a) is true, and any
value `not a` (i.e., X \= a)
p(A) is also true; (iii) or, if both
sources are equally reliable, them we have (at least) two different
models: one where
q(a) is true and another where
p(A) is true (also
See more details here.
A variant of the traveling salesman problem (visiting every city in a country only once, starting and ending in the same city, and moving between cities using the existing connections) where, in addition, we want to find out the length of the Hamiltonian cycle.
Solutions for this problem using `CLP(FD)
and ASP` appear in
(Dovier et al. 2005),
with comparable performance. However, they show that the ASP
encoding is more compact, even if the `CLP(FD)` version uses the
library predicate circuit/1, which does the bulk of the work and
whose code is non-trivial.
We will show that also in this problem, where the ASP solution is more
compact than that of `CLP(FD)`,
s(CASP) is more expressive.
See more details here
Let us compare the expressiveness of
s(CASP) vs ASP + constraints
using the spoiling Yale shooting scenario
(Janhunen et al. 2017).
In this scenario we have an unloaded gun and three possible actions load, shoot, and wait. If we load the gun, it becomes loaded. If we shoot the gun and it was loaded for no more than 35 minutes, the turkey is killed. Otherwise, the gun powder is spoiled. We are looking for an executable plan such that:
See more details here
Let us use
s(CASP) to implement Event Calculus, a more complex
application, with several scenarios.
In this [folder](examples/benchmark_EventCalculus/lopstr19/) you will find the benchmark and instruction to reproduce the evaluation and example presented in the paper __"Modelling and Reasoning in Event Calculus using Goal-Directed Constraint Answer Set Programming"__, presented in LOPSTR'19.
See more details here
Pack contains 472 files holding a total of 1.2M bytes.