Me: write a spell checker in scheme that implements suggestions of corrections using the levenstein distance
ChatGPT:
(define (levenstein-distance str1 str2)
(define (min3 a b c)
(min (min a b) c))
(define (lev-distance str1-len str2-len)
(if (or (= str1-len 0) (= str2-len 0))
(max str1-len str2-len)
(let ((cost (if (char=? (string-ref str1 (sub1 str1-len))
(string-ref str2 (sub1 str2-len)))
0
1)))
(min3 (lev-distance str1-len (sub1 str2-len))
(lev-distance (sub1 str1-len) str2-len)
(lev-distance (sub1 str1-len) (sub1 str2-len)
(+ cost))))))
(lev-distance (string-length str1) (string-length str2)))
(define (spell-checker dictionary word)
(let ((min-distance 100)
(closest-word ""))
(map (lambda (dict-word)
(let ((distance (levenstein-distance dict-word word)))
(when (< distance min-distance)
(set! min-distance distance)
(set! closest-word dict-word))))
dictionary)
closest-word))
(define dictionary '("hello" "world" "scheme" "levenstein" "distance"))
(spell-checker dictionary "worl")
;; Returns: "world"
(spell-checker dictionary "distnace")
;; Returns: "distance"
(spell-checker dictionary "schme")
;; Returns: "scheme"