<< Previous

Next >>

Odd One

Raw image of automaton Odd One.

Odd One accepts all strings starting and ending with some number of zeros, including an odd number of contiguous ones between the zeros.

Annotated Image

Annotated image of automaton Odd One.

Program Specification

;;;
;;; Preamble
;;;
(set-logic ALL)

;;;
;;; State Definitions
;;;
(define-fun is-state ((q Int)) Bool
    (and (< (- 1) q) (< q 5)))

(define-fun is-accepting ((q Int)) Bool
    (or (= q 1) (= q 4)))

(declare-fun IS () Int)
(assert (is-state IS))
(assert (not (= 0 IS)))

;;;
;;; Transition Definitions
;;;
(declare-fun T (Int String) Int)

;; All transitions must go to a valid state
(assert (forall ((q Int) (symb String))
    (=> (is-state q) (is-state (T q symb)))))

;; It must not be possible to leave the zero state
(assert (forall ((symb String)) (= 0 (T 0 symb))))

;; Defined transitions
(assert (= 1 (T 1 "0")))
(assert (= 3 (T 1 "1")))
(assert (= 2 (T 3 "1")))
(assert (= 3 (T 2 "1")))
(assert (= 4 (T 3 "0")))
(assert (= 4 (T 4 "0")))

;; Negative transitions
(assert (forall ((symb String))
    (=> (not (or (= symb "0") (= symb "1")))
        (= 0 (T 1 symb)))))
(assert (forall ((symb String))
    (=> (not (or (= symb "1")))
        (= 0 (T 2 symb)))))
(assert (forall ((symb String))
    (=> (not (or (= symb "1") (= symb "0")))
        (= 0 (T 3 symb)))))
(assert (forall ((symb String))
    (=> (not (or (= symb "0")))
        (= 0 (T 4 symb)))))
;;;
;;; Examples
;;;
(define-fun-rec exec-dfa ((q Int) (input String)) Bool
    (ite (= 0 (str.len input))
         (is-accepting q)
         (exec-dfa (T q (str.at input 0)) (str.substr input 1 (- (str.len input) 1)))))

;; Positive
(assert (exec-dfa IS "00100"))

;; Negative
(assert (not (exec-dfa IS "0110")))
;;;
;;; Postamble
;;;
(check-sat)
(get-model)

Synthesized Program

sat
(
  (define-fun IS () Int
    1)
  (define-fun T ((x!0 Int) (x!1 String)) Int
    (let ((a!1 (or (and (<= 1 x!0)
                        (not (<= 2 x!0))
                        (not (= x!1 "0"))
                        (not (= x!1 "1")))
                   (and (not (<= 1 x!0)) (= x!1 "1"))
                   (and (not (<= 1 x!0)) (= x!1 "0") (not (= x!1 "1")))
                   (and (<= 1 x!0)
                        (<= 2 x!0)
                        (not (<= 3 x!0))
                        (= x!1 "0")
                        (not (= x!1 "1")))
                   (and (<= 1 x!0)
                        (<= 2 x!0)
                        (<= 3 x!0)
                        (not (<= 4 x!0))
                        (not (= x!1 "0"))
                        (not (= x!1 "1")))
                   (and (<= 1 x!0)
                        (<= 2 x!0)
                        (not (<= 3 x!0))
                        (not (= x!1 "0"))
                        (not (= x!1 "1")))
                   (and (<= 1 x!0) (<= 2 x!0) (<= 3 x!0) (<= 4 x!0) (= x!1 "1"))
                   (and (<= 1 x!0)
                        (<= 2 x!0)
                        (<= 3 x!0)
                        (<= 4 x!0)
                        (not (= x!1 "0"))
                        (not (= x!1 "1")))
                   (and (not (<= 1 x!0)) (not (= x!1 "0")) (not (= x!1 "1")))))
          (a!2 (or (and (<= 1 x!0)
                        (<= 2 x!0)
                        (<= 3 x!0)
                        (<= 4 x!0)
                        (= x!1 "0")
                        (not (= x!1 "1")))
                   (and (<= 1 x!0)
                        (<= 2 x!0)
                        (<= 3 x!0)
                        (not (<= 4 x!0))
                        (= x!1 "0")
                        (not (= x!1 "1")))))
          (a!3 (ite (and (<= 1 x!0)
                         (not (<= 2 x!0))
                         (= x!1 "0")
                         (not (= x!1 "1")))
                    1
                    12)))
    (let ((a!4 (ite (and (<= 1 x!0) (not (<= 2 x!0)) (= x!1 "1")) 3 a!3)))
    (let ((a!5 (ite (and (<= 1 x!0)
                         (<= 2 x!0)
                         (<= 3 x!0)
                         (not (<= 4 x!0))
                         (= x!1 "1"))
                    2
                    a!4)))
    (let ((a!6 (ite (and (<= 1 x!0) (<= 2 x!0) (not (<= 3 x!0)) (= x!1 "1"))
                    3
                    a!5)))
      (ite a!1 0 (ite a!2 4 a!6)))))))
)

<< Previous

Next >>