schelog %let danger

#lang scheme
(require racklog)


(define %derive-type
 (%let ( X Y T)
       (%rel ( ) [( (list '+ X Y  ) 'pls) ]
)))

(%which (T)     (%derive-type '(+ z y ) T )) ;=> ((T . pls))
(%which (X Y T) (%derive-type (list '+ X Y ) T )); => ((X . z) (Y . y)
(T . pls)) ;;why ? bug?


(define %derive-type2

  (%rel (X Y T )       [( (list '+ X Y  ) 'pls) ]
))

(%which (T)     (%derive-type2 '(+ z y ) T ));=> ((T . pls))
(%which (X Y T) (%derive-type2 (list '+ X Y ) T ));=>((X . _) (Y . _)
(T . pls)) ;; its OK