kframework / haskell-core-semantics

Haskell's Core in K.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Execution of `ChurchBool.pkore`

ayberkt opened this issue · comments

Consider the following program

foo :: Integer
foo =
  let true = (\x -> \y -> x)
       false = (\x -> \y -> y)
       not p = p false true
  in (not true) 1 2

which results in 2.

The generated K/PKore representation is the following.

let(nonRec(tmVar([type omitted], name(false)), lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tmVar([type omitted], name(x)), lam(tmVar([type omitted], name(y)), var(tmVar([type omitted], name(y)))))))), let(nonRec(tmVar([type omitted], name(true)), lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tmVar([type omitted], name(x)), lam(tmVar([type omitted], name(y)), var(tmVar([type omitted], name(x)))))))), app(app(app(app(app(app(app(app(lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tyVar([type omitted], name(t)), lam(tmVar([type omitted], name(p)), app(app(var(tmVar([type omitted], name(p))), app(app(var(tmVar([type omitted], name(false))), type([type omitted])), type([type omitted]))), app(app(var(tmVar([type omitted], name(true))), type([type omitted])), type([type omitted]))))))))), type([type omitted])), type([type omitted])), type([type omitted])), type([type omitted])), type([type omitted])), app(app(var(tmVar([type omitted], name(true))), type([type omitted])), type([type omitted]))), lit(litInt(1, [type omitted]))), lit(litInt(2, [type omitted])))))

kruning this, however, gets stuck at:

  <k>
    var ( tmVar ( [type omitted] , name ( true ) ) )
    ~> #freezerapp(_,_)1 ( type ( [type omitted] ) )
    ~> #freezerapp(_,_)1 ( type ( [type omitted] ) )
    ~> #freezerupdate1 ( 9 )
    ~> restoreEnv ( name ( false ) |-> 1 name ( p ) |-> 9 name ( true ) |-> 2 )
    ~> var ( tmVar ( [type omitted] , name ( p ) ) )
    ~> #freezerapp(_,_)1 ( app ( app ( var ( tmVar ( [type omitted] , name ( false ) ) ) , type ( [type omitted] ) ) , type ( [type omitted] ) ) )
    ~> #freezerapp(_,_)1 ( app ( app ( var ( tmVar ( [type omitted] , name ( true ) ) ) , type ( [type omitted] ) ) , type ( [type omitted] ) ) ) ~> restoreEnv ( name ( false ) |-> 1 name ( true ) |-> 2 )
    ~> #freezerapp(_,_)1 ( lit ( litInt ( 1 , [type omitted] ) ) )
    ~> #freezerapp(_,_)1 ( lit ( litInt ( 2 , [type omitted] ) ) )
    ~> restoreEnv ( name ( false ) |-> 1 )
    ~> restoreEnv ( .Map )
  </k>

cc: @bmmoore @lucaspena

The sample program is added in #6. You can see the full krun output in the Travis log.

Fixed.