-
Notifications
You must be signed in to change notification settings - Fork 0
/
l.bak
35 lines (29 loc) · 1.82 KB
/
l.bak
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
#lang racket
(require "l-interpreter.rkt")
; production-rule-set finder
(define (find-production-rule-set system-states)
(define system-alphabet (remove-duplicates (car (last system-states)))) ; get system alphabet from last state
(define alphabet (range (length system-alphabet))) ; get alphabet from system alphabet (encode system alphabet as integers representing indices in system alphabet)
(define states (map (lambda (state)
(cons (map (lambda (symbol)
(index-of system-alphabet symbol))
(car state))
(cdr state)))
system-states)) ; get encoded states from system states by using said alphabet encoding
(define valid-successors (combinations (car (last states)))) ; get valid successors from all possible subsets of last state
(define production-rule-set (find-from-states states alphabet valid-successors)) ; solve for valid production rule set
(define system-production-rule-set (build-list (length production-rule-set) (lambda (position) (cons (list-ref system-alphabet position) (map (lambda (symbol) (list-ref system-alphabet symbol)) (list-ref production-rule-set position)))))) ; transform production rule set to use system alphabet
system-production-rule-set)
; production-rule-set printer
(define (print-production-rule-set production-rule-set)
(for ([production-rule production-rule-set])
(display (car production-rule))
(display " -> ")
(display (cdr production-rule))
(newline)))
; test
(define state-1 (list "a" "b"))
(define state-2 (list "a" "b" "a"))
(define state-3 (list "a" "b" "a" "a"))
(define production-rule-set (find-production-rule-set (list (cons state-1 0) (cons state-2 1) (cons state-3 2))))
(print-production-rule-set production-rule-set)