|Did you know ...||Search Documentation:|
|Pack rdet -- README.md|
Many predicates dealing with databases and external systems are non-failure. These predicates have the following properties:
This library attempts to provide runtime check for these conditions.
Use directive rdet/1 to annotate predicates that are supposed to be deterministic:
When annotated predicate call fails, an error is thrown:
:- use_module(library(rdet)). :- rdet(insert_sort/2). :- rdet(i_sort/3). :- rdet(insert/3). insert_sort(List, Sorted):- i_sort(List, , Sorted). i_sort(, Acc, Acc). i_sort([H|T], Acc, Sorted):- insert(H,Acc,NAcc), i_sort(T,NAcc,Sorted). insert(X,[Y|T],[Y|NT]):- X>Y, insert(X,T,NT). insert(X,[Y|T],[X,Y|T]):- X=<Y. insert(X,[a],[X]).
Running the sorting procedure will throw an error (the last clause of insert/3 is intentionally made to fail with numbers):
?- insert_sort([2,4,1,3], Sorted). ERROR: Unhandled exception: Goal insert/3 failed.
The library uses SWI-Prolog built-in predicate
wrap_predicate to insert
Previous version of this library was using goal expansion.
rdet debug statements (before loading code to be enhanced):
?- debug(rdet). Warning: rdet: no matching debug topic (yet) true. ?- [insert]. % rdet: adding goal: user:insert_sort/2 % rdet: adding goal: user:i_sort/3 % rdet: adding goal: user:insert/3 true.
user usually contains the code that is not explicitly
put into a module.
Good luck building a static analysis system that includes the following:
And has all of this optional: you can combine your code easily with 3rd party untyped/unmoded libraries.
To install as a package:
It requires a recent SWI-Prolog version 8.x or newer.
In the package root, insert into swipl:
Or if you cloned the repo:
Please send bug reports/feature request through the GitHub project page.
The MIT license. See the LICENSE file.