aboutsummaryrefslogtreecommitdiff
path: root/rego-proofs/compiler/passes/compile-for-all.scm
blob: ccc41852c553ce7ed0169cec0a147d1586274c36 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
;;; Copyright © 2023 Jakob L. Kreuze <zerodaysfordays@sdf.org>
;;;
;;; This program is free software; you can redistribute it and/or
;;; modify it under the terms of the GNU General Public License as
;;; published by the Free Software Foundation; either version 3 of the
;;; License, or (at your option) any later version.
;;;
;;; This program is distributed in the hope that it will be useful,
;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with this program. If not, see
;;; <http://www.gnu.org/licenses/>.

(define-module (compiler passes compile-for-all)
  #:use-module ((rnrs base) #:select (assert))
  #:use-module (compiler lean)
  #:use-module (compiler types)
  #:use-module (compiler utilities)
  #:use-module (ice-9 match)
  #:use-module (oop goops)
  #:use-module (srfi srfi-1)
  #:export (compile-for-all))

(define (compile-for-all policy)
  (policy-map
   policy
   (lambda (scope breadcrumb form)
     (match form
       (($ <for-all> domain key value body)
        (assert (is-a? value <variable-ref>))

        (let ((local (variable-ref->local value)))
          (add-to-scope scope breadcrumb local))

        (make <lean-for-all>
          #:variables `(,value)
          #:body (make <lean-conjunction>
                   #:clauses
                   `(,(cond ;; TODO: Type inference.
                       (else (make <lean-funcall>
                               #:name "Array.contains"
                               #:args `(,value ,domain)
                               )))
                     ,@body))))
       (_ form)))))

© 2015 - 2026 Jakob L. Kreuze