Skip to content

Instantly share code, notes, and snippets.

@jarble
Last active February 17, 2019 05:19
Show Gist options
  • Save jarble/6f89c17f9fdd78b2556b46308840e309 to your computer and use it in GitHub Desktop.
Save jarble/6f89c17f9fdd78b2556b46308840e309 to your computer and use it in GitHub Desktop.
A simple example of type inference in Prolog using Constraint Handling Rules
:- initialization(main).
:- set_prolog_flag('double_quotes','chars'). ;this is for SWI-Prolog
:- use_module(library(chr)).
:- chr_constraint type/2.
type(A,B) \ type(A,B) <=> true.
type((A;B),C) ==> C = bool,type(A,bool),type(B,bool).
type((A,B),C) ==> C = bool,type(A,bool),type(B,bool).
type(A>B,C) ==> C = bool,type(A,number),type(B,number).
type(A<B,C) ==> C = bool,type(A,number),type(B,number).
type(A+B,C) ==> C = number,type(A,number),type(B,number).
type(A-B,C) ==> C = number,type(A,number),type(B,number).
type(A*B,C) ==> C = number,type(A,number),type(B,number).
type(A/B,C) ==> C = number,type(A,number),type(B,number).
type(append(A,B,C))
type(A is B,C) ==> C = number,type(A,number),type(B,number).
type(A = B,C) ==> type(A,C),type(B,C).
type(A \= B,C) ==> type(A,C),type(B,C).
type(append(A,B,C))
type(true,bool).
type(false,bool).
type(A,B) ==> number(A) | B=number.
main :- type((B>D),C),writeln(C).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment