From f9199f6e3710018c2162f0453ae10ef164534063 Mon Sep 17 00:00:00 2001 From: AlexKnauth Date: Mon, 10 Apr 2017 20:55:23 -0700 Subject: [PATCH] Use filter-maximal for pruning redundant elements in unions --- turnstile/examples/stlc+union.rkt | 8 ++-- turnstile/examples/util/filter-maximal.rkt | 54 ++++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 turnstile/examples/util/filter-maximal.rkt diff --git a/turnstile/examples/stlc+union.rkt b/turnstile/examples/stlc+union.rkt index 2ce4e34..aaaa384 100644 --- a/turnstile/examples/stlc+union.rkt +++ b/turnstile/examples/stlc+union.rkt @@ -3,6 +3,8 @@ #:except #%app #%datum + add1 sub1 * Int Int? ~Int Float Float? ~Float Bool ~Bool Bool?) +(require (for-syntax "util/filter-maximal.rkt")) + ;; Simply-Typed Lambda Calculus, plus union types ;; Types: ;; - types from and ext+stlc.rkt @@ -45,11 +47,9 @@ (define-for-syntax (prune+sort tys) (stx-sort - (remove-duplicates + (filter-maximal (stx->list tys) - ;; remove dups keeps first element - ;; but we want to keep supertype - (lambda (x y) (typecheck? y x))))) + typecheck?))) (define-syntax (U stx) (syntax-parse stx diff --git a/turnstile/examples/util/filter-maximal.rkt b/turnstile/examples/util/filter-maximal.rkt new file mode 100644 index 0000000..d3901a7 --- /dev/null +++ b/turnstile/examples/util/filter-maximal.rkt @@ -0,0 +1,54 @@ +#lang racket/base + +(provide filter-maximal) + +(module+ test + (require rackunit + (only-in racket/list in-permutations) + (only-in racket/set set=? subset?))) + +;; filter-maximal : [Listof X] [X X -> Bool] -> [Listof X] +;; Bool] -> [Listof X] +;;