;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Examples of both backward and forward curried chainers. ;; ;; ;; ;; Indeed, for the forward chainer to be curried it must be able to go ;; ;; backward in order to unfold the rules. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;; ;; Nat ;; ;;;;;;;;; ;; Define Nat (: Nat Type) (: Z Nat) (: S (-> Nat Nat)) ;; Define <= (: <= (-> $a $a Bool)) (= (<= $x $y) (or (< $x $y) (== $x $y))) ;; Define cast functions between Nat and Number (: fromNumber (-> Number Nat)) (= (fromNumber $n) (if (<= $n 0) Z (S (fromNumber (- $n 1))))) (: fromNat (-> Nat Number)) (= (fromNat Z) 0) (= (fromNat (S $k)) (+ 1 (fromNat $k))) ;;;;;;;;;;;;;;;;;;;; ;; Knowledge base ;; ;;;;;;;;;;;;;;;;;;;; !(bind! &kb (new-space)) !(add-atom &kb (: a A)) !(add-atom &kb (: ab (→ A B))) !(add-atom &kb (: ModusPonens (-> (→ $p $q) (-> $p $q)))) ;;;;;;;;;;;;;;;;;;;;;; ;; Backward chainer ;; ;;;;;;;;;;;;;;;;;;;;;; ;; Curried Backward Chainer (: bc (-> $a Nat $a)) ;; Base case (= (bc (: $prf $ccln) $_) (match &kb (: $prf $ccln) (: $prf $ccln))) ;; Recursive step (= (bc (: ($prfabs $prfarg) $ccln) (S $k)) (let* (((: $prfabs (-> $prms $ccln)) (bc (: $prfabs (-> $prms $ccln)) $k)) ((: $prfarg $prms) (bc (: $prfarg $prms) $k))) (: ($prfabs $prfarg) $ccln))) ;;;;;;;;;;;;;;;;;;;;; ;; Forward chainer ;; ;;;;;;;;;;;;;;;;;;;;; ;; Curried Forward Chainer (: fc (-> $a Nat $a)) ;; Base case. Beware that the provided source is assumed to be true. (= (fc (: $proof $premise) $_) (: $proof $premise)) ;; Recursive step (= (fc (: $prfarg $premise) (S $k)) (let (: $prfabs (-> $premise $ccln)) (bc (: $prfabs (-> $premise $ccln)) $k) (fc (: ($prfabs $prfarg) $ccln) $k))) (= (fc (: $prfabs (-> $prms $ccln)) (S $k)) (let (: $prfarg $prms) (bc (: $prfarg $prms) $k) (fc (: ($prfabs $prfarg) $ccln) $k))) ;;;;;;;;;;; ;; Tests ;; ;;;;;;;;;;; ;; Test curred backward chainer !(assertEqual (bc (: $prf A) (fromNumber 0)) (: a A)) !(assertEqual (bc (: $prf B) (fromNumber 2)) (: ((ModusPonens ab) a) B)) ;; Test curried forward chainer !(assertEqualToResult (fc (: ab (→ A B)) (fromNumber 1)) ((: ab (→ A B)) (: (ModusPonens ab) (-> A B)))) !(assertEqualToResult (fc (: ab (→ A B)) (fromNumber 2)) ((: ab (→ A B)) (: (ModusPonens ab) (-> A B)) (: ((ModusPonens ab) a) B))) !(assertEqualToResult (fc (: a A) (fromNumber 3)) ((: a A) (: ((ModusPonens ab) a) B)))