#lang racket
(require redex/reduction-semantics)
(define-language L
(ts ::= variable number))
(define-judgment-form L
#:mode (subsequence I I)
#:contract (subsequence (ts ...) (ts ...))
[----------------------------------------------
(subsequence (ts_1 ...)
(ts_2 ... ts_1 ... ts_3 ...))])
(test-judgment-holds
(subsequence () (1 2 3 4)))
(test-judgment-holds
(subsequence (1) (1 2 3 4)))
(test-judgment-holds
(subsequence (2) (1 2 3 4)))
(test-judgment-holds
(subsequence (1 2) (1 2 3 4)))
(test-judgment-holds
(subsequence (2 3) (1 2 3 4)))
(test-judgment-holds
(subsequence (3 4) (1 2 3 4)))
(test-judgment-holds
(subsequence (2 3 4) (1 2 3 4)))
(test-judgment-holds
(subsequence (1 2 3) (1 2 3 4)))
(test-judgment-holds
(subsequence (1 2 3 4) (1 2 3 4)))
(test-equal
(judgment-holds (subsequence (5) (1 2 3 4))) #f)
(test-equal
(judgment-holds (subsequence (3 2) (1 2 3 4))) #f)
(test-equal
(judgment-holds (subsequence (4 1) (1 2 3 4))) #f)
(test-results)