;;; -*- Mode: LISP; Mode: Font-Lock; -*- (in-package :user) ;;; ;;; `haha' --- Trennung von deklarativem und prozeduralem Wissen ;;; ;;; ;;; Automatenbeschreibung als "Ubergangstabelle; Spalte 0 zeigt Endzust"ande ;;; (defparameter *haha* (make-array (list 3 3) :initial-contents '((nil 1 nil) (nil nil 2 ) (t 1 nil)))) ;;; ;;; Abbildung zwischen Eingabesymbolen und Spalten 1 .. n der Tabelle ;;; (defun token2code (token) (case token (h 1) (a 2))) ;;; ;;; traverse arbeitet INPUT entsprechend der Automatenbeschreibung *HAHA* ab; ;;; liefert `t' bei erfolgreicher Erkennung, ansonsten `nil'. ;;; (defun traverse (input &optional (state 0)) (if input (let ((next (aref *haha* state (token2code (first input))))) (when next (traverse (rest input) next))) (aref *haha* state 0))) ;;; ;;; Beispiele: ;;; ;;; (traverse '(h a h a)) --> t ;;; (traverse '(h a h)) --> nil ;;;