(module kmp (main appel) (import kmp-tableau)) (define (appel args) (print (kmp:KMP (cadr args) (caddr args)))) (define (kmp:KMP Mot Texte) (let ((Tpref (kmp:tableau Mot)) (L-texte (string-length Texte)) (L-mot (string-length Mot)) (i 0) (j 0)) (let boucle () (if (char=? (string-ref Texte (+ i j)) (string-ref Mot j)) (set! j (+ j 1)) (begin (set! i (- (+ i j) (vector-ref Tpref j))) (if (> j 0) (set! j (vector-ref Tpref j))))) (if (and (< (+ i j) L-texte) (< j L-mot)) (boucle))) (if (= j L-mot) i (+ i j))))