;; lib/maude/tests/run.sx — running a Maude program (module + commands). (define mrn-pass 0) (define mrn-fail 0) (define mrn-failures (list)) (define mrn-check! (fn (name got expected) (if (= got expected) (set! mrn-pass (+ mrn-pass 1)) (do (set! mrn-fail (+ mrn-fail 1)) (append! mrn-failures (str name " expected: " expected " got: " got)))))) (define mrn-peano "fmod PEANO is\n sorts Nat NzNat .\n subsort NzNat < Nat .\n op 0 : -> Nat .\n op s_ : Nat -> NzNat .\n op _+_ : Nat Nat -> Nat .\n op _*_ : Nat Nat -> Nat .\n vars X Y : Nat .\n eq 0 + Y = Y .\n eq s X + Y = s (X + Y) .\n eq 0 * Y = 0 .\n eq s X * Y = Y + (X * Y) .\nendfm\nred s 0 + s s 0 .\nred 0 + 0 .\nreduce in PEANO : s s 0 * s s 0 .") (mrn-check! "peano-results" (mau/run mrn-peano) (list "(s (s (s 0)))" "0" "(s (s (s (s 0))))")) (mrn-check! "peano-count" (len (mau/run-program mrn-peano)) 3) (mrn-check! "peano-cmd-kind" (get (first (mau/run-program mrn-peano)) :cmd) "reduce") ;; least-sort annotated output: s_ : Nat -> NzNat, so s(...) is NzNat (mrn-check! "peano-pretty" (mau/run-pretty mrn-peano) (list "result NzNat: (s (s (s 0)))" "result Nat: 0" "result NzNat: (s (s (s (s 0))))")) (define mrn-coins "mod COINS is\n sort M .\n op nil : -> M .\n op q : -> M .\n op d : -> M .\n op _;_ : M M -> M [assoc comm id: nil] .\n rl [change] : q ; q ; q ; q => d .\nendm\nrew q ; q ; q ; q ; q .\nrewrite q ; q ; q ; q ; q ; q ; q ; q .") (mrn-check! "coins-results" (mau/run mrn-coins) (list "(d ; q)" "(d ; d)")) (mrn-check! "coins-cmd-kind" (get (first (mau/run-program mrn-coins)) :cmd) "rewrite") ;; search command (define mrn-ndet "mod NDET is\n sort S .\n ops a b c goal : -> S .\n rl [r1] : a => b .\n rl [r2] : a => c .\n rl [r3] : c => goal .\nendm\nsearch a =>* goal .\nsearch a =>* b .\nsearch b =>* goal .") (mrn-check! "search-results" (mau/run mrn-ndet) (list "a => c => goal" "a => b" "no solution")) (mrn-check! "search-cmd-kind" (get (first (mau/run-program mrn-ndet)) :cmd) "search") (mrn-check! "search-pretty" (first (mau/run-pretty mrn-ndet)) "search: a => c => goal") ;; module-only (no commands) runs to an empty result list (mrn-check! "no-commands" (mau/run "fmod EMPTY is\n sort S .\n op a : -> S .\nendfm") (list)) (define mau-run-tests-run! (fn () {:failures mrn-failures :total (+ mrn-pass mrn-fail) :passed mrn-pass :failed mrn-fail}))