Type Inference Utility on Fundamentally 1-arg Predicates
1Type-I : type-inference from a predicate
This library tries to provide a way to detect what kind of type the given predicate is trying to check. This is different from inferring the return type of a function. For example,
(eq 'null (test-type '(eql nil ?))) (eq 'string (test-type '(stringp ?)))
The inference is done on form basis, and the equivalence of predicates are
#'equal. To simplify the design, the argument to check
should be a symbol
?, exported in package
test-type returns the inferred type. In contrast,
returns a list of all possible test predicates that returns true when
is bound to the object of interest.
(is (subset '((TYPEP ? 'integer) (integerp ?)) (type-tests 'integer))) ;; more inference on integers, e.g., (< 0 ? 4), should be added (is (subset '((TYPEP ? '(mod 5)) (TYPEP ? '(integer 0 4))) (type-tests '(mod 5))))
This library is extensible. with
define-inference-rule macro, you can add
more inferers to improve this library. Each inference rule is a unary
function that takes a predicate form, then returns a list of more
test-type searches in the form space, adding the results of each
inference rule, until a form
(typep ? X) is found (where X is
unknown). If it fails to find such a form even if the maximal set
is obtained, then the
test-type returns nil.
type-tests just returns
the maximal set.
I currently implemented the following inference rules:
- typep --
(typep ? 'array)->
- unary --
(arrayp ?)-> =(typep ? 'array) (typep ? '(array)) (typep ?'(array *))= ...
- null --
(null ?) (typep ? null) (eql ? nil) (eql nil ?) (eq ? nil)...
- derived -- call
Inference on exhaustive partitions, e.g.,
(typep ? 'list) ->
'(or cons null)) is planned.
This library is at least tested on implementation listed below:
- SBCL 1.2.8 on X86-64 Linux 3.13.0-46-generic (author's environment)
Also, it depends on the following libraries:
- Trivia by Masataro Asai
- NON-Optimized Pattern Matching Library
- alexandria by
- Alexandria is a collection of portable public domain utilities.
- iterate by
- Jonathan Amsterdam's iterator/gatherer/accumulator facility
- introspect-environment by Bike <firstname.lastname@example.org>
- Small interface to portable but nonstandard introspection of CL environments.
- Masataro Asai (email@example.com)
Copyright (c) 2015 Masataro Asai (firstname.lastname@example.org)
Licensed under the LLGPL License.