Zulip Chat Archive

Stream: new members

Topic: Product meta program


Ken Roe (Jul 29 2018 at 18:48):

Here is a simple meta program to simplify a product expression. It does not seem to match anything. Can someone explain what is happening?

meta def simplifyProd : expr  expr
| (expr.app
    (expr.app
      (expr.app `(prod.fst) tt1a)
      tt1b)
     (expr.app
        (expr.app
          (expr.app
            (expr.app `(prod.mk) tt1) tt2) a) b)) := a
| (expr.app a b) := expr.app (simplifyProd a) (simplifyProd b)
| (expr.lam v b t e) := expr.lam v b (simplifyProd t) (simplifyProd e)
| (expr.pi v b t e) := expr.pi v b (simplifyProd t) (simplifyProd e)
| x := x

theorem testit (f:) (s:) :
    (f,s).fst=f :=
begin
   do {
       t  target,
       trace "Start",
       trace t.to_raw_fmt,
       tq  some (simplifyProd t),
       trace tq.to_raw_fmt,
       change tq
   },
   refl
end

Reid Barton (Jul 29 2018 at 19:26):

Well, I don't know, but replacing the first case with | `(prod.fst (prod.mk %%a %%b)) := a works.
Maybe something involving universe variables?

Kevin Buzzard (Jul 29 2018 at 19:32):

@Ken Roe Just to let you know that probably nobody is reading the Lean bug reports. The developers are working on Lean 4 and anything that isn't obviously a serious issue in 3.4.1 which needs addressing (e.g. a proof of false) is very likely to be ignored.

Ken Roe (Jul 29 2018 at 21:18):

Actually, `(prod.fst (prod.mk %%a %%b)) probably works but I'm trying to avoid quoting. I doing pattern matching that is breaking apart \lambda expressions and I found that %%x inside a lambda lifts the variables (which I would like to avoid). I've also been running into type checking issues. If people are interested, I can post more cases illustrating more issues.

Right now, I'm pretty frustrated. I'm trying to build a separation logic using Lean. Right now, all paths to building the necessary tactics are blocked due to missing documentation or bugs.

Patrick Massot (Jul 29 2018 at 21:20):

You should talk to Simon, he knows both tactics and separation logic in Lean

Simon Hudon (Jul 29 2018 at 21:25):

If you want, I have started on a separation logic package: https://github.com/unitb/separation-logic. It might be easier to collaborate on it.

Simon Hudon (Jul 29 2018 at 21:26):

So far, my tactics can handle a twenty-line proof of the list reversal program: https://github.com/unitb/separation-logic/blob/master/src/separation/examples.lean#L118-L137

Ken Roe (Jul 29 2018 at 21:34):

Can someone send me a private message with Simon's contact information? By the way, to illustrate another issue, I just added another case which causes simplifyProd to not compile.

meta def simplifyProd : expr  expr
| (expr.app
    (expr.app
      (expr.app `(prod.fst) tt1a)
      tt1b)
     (expr.app
        (expr.app
          (expr.app
            (expr.app `(prod.mk) tt1) tt2) a) b)) := a
| `((λ x, (%%f) x) (%%z)) := `(%%f (%%z+1))
| (expr.app a b) := expr.app (simplifyProd a) (simplifyProd b)
| (expr.lam v b t e) := expr.lam v b (simplifyProd t) (simplifyProd e)
| (expr.pi v b t e) := expr.pi v b (simplifyProd t) (simplifyProd e)
| x := x

theorem testit (f:) (s:) :
    (f,s).fst=f :=
begin
   do {
       t  target,
       trace "Start",
       trace t.to_raw_fmt,
       tq  some (simplifyProd t),
       trace tq.to_raw_fmt,
       change tq
   },
   refl
end

This case with the lambda gives the following error on the %%f:

function expected at
  _x_1
term has type
  ?m_1

Patrick Massot (Jul 29 2018 at 21:35):

you can click on his name, right above your question

Patrick Massot (Jul 29 2018 at 21:36):

I mean: right above in this thread

Ken Roe (Jul 29 2018 at 21:37):

Never mind on the contact info--I just saw a message from Simon.

I'm more than happy to collaborate on separation logic. I did work on separation logic using Coq for my PhD. You can check out my home page at www.cs.jhu.edu/~roe. I'm working on porting my system to Lean.

Simon Hudon (Jul 29 2018 at 21:40):

Cool thanks, that should be helpful. You can have a look at how far I got right here: https://leanprover.zulipchat.com/#narrow/stream/113489-new-members/subject/Product.20meta.20program/near/130540986

Ken Roe (Jul 30 2018 at 18:48):

Actually, an ideal solution would be not to use `(prod.mk). Is there an alternative that I can plug in without changing the surrounding text? I would like to find a way of expression my product meta program without using any back quote annotations. The motivation is that I actually have some more complex meta programs where I'm finding the back quote notation has semantics that is causing a number of problems.

Simon Hudon (Jul 30 2018 at 18:57):

Can you show us that other program?

Ken Roe (Jul 30 2018 at 21:39):

I'll put it up in a day or two. The code isn't stand alone. It is dependent on the infrastructure in my separation logic framework. I need to put the work into a github repository and then post the critical meta functions.

Ken Roe (Aug 06 2018 at 03:52):

I've posted the source code that I have of my separation framework so far here: https://github.com/kendroe/pedantic2. Some of my future questions will point to this repository. I'm porting the Coq implementation. Information on this implementation (and repository link) can be found here: http://www.cs.jhu.edu/~roe.


Last updated: Dec 20 2023 at 11:08 UTC