-
Notifications
You must be signed in to change notification settings - Fork 153
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[KIP] - Lift the Binding Restriction on :=K #2477
Comments
@dwightguth you weren't in the meeting, and we could use your input on this. |
Yes, you are going to need backend support in order to implement this. Right now the symbol is implemented by means of creating a new function that performs the matching and returns a boolean, but there is no way to propagate the binding out of the function and back to the original rule with this approach. You will have to actually implement native support for this symbol in the backend if you want this capability. I'm not entirely sure how best it should work if that's what you want to do. A where clause on rules might be your best bet rather than trying to implicitly extract the terms from the rule using the existing syntax. If you go that route, then the decision tree generation algorithm in the llvm backend would have to become aware of these bindings, and the code generator would have to be modified in order to correctly produce those values when the side condition is evaluated. You would also have to figure out how to pass the values from the side condition to the rhs, because currently, side condition functions in the llvm backend simply return a boolean, which is not enough information in this case. |
By "boolean" I presume you mean an LLVM In that case, does the LLVM backend already have some matching function (generator, possibly) for regular matches that produces a structure with binding information? I'd think it would be possible to use the same method used for regular matches and treat the results the same way a regular side condition is treated in the decision tree. The new needed support would be a way to gather bindings from it. Perhaps this is exactly what you're suggesting, I'm not sure. Also probably worth mentioning that Everett pointed out to me that you don't quite get |
I mean, the llvm backend represents the Bool type as an |
Here is an example that shows the advantage that using
If the binding restriction on
Note that Trying to rewrite the above rule using
So using
The downside is that this it is somewhat less "obvious" what is going and increases the cognitive load a bit, but in the meantime this looks like a good solution. |
For the frontend:
For the LLVM backend:
For the Haskell backend:
|
…untimeverification#1830) * haskell-backend/src/main/native/haskell-backend: 79703e11 - Update dependency: deps/k_release * haskell-backend/src/main/native/haskell-backend: 8428df45 - LTS Haskell 17.4 * haskell-backend/src/main/native/haskell-backend: 2e714c56 - Add an EquationVariableName to RewritingVariableName * haskell-backend/src/main/native/haskell-backend: c5cc46be - Update dependency: deps/k_release * haskell-backend/src/main/native/haskell-backend: 0c4ad203 - Update dependency: deps/k_release * haskell-backend/src/main/native/haskell-backend: a182994f - Update dependency: deps/k_release * haskell-backend/src/main/native/haskell-backend: 9460590a - Simplify side conditions (runtimeverification#2393) * haskell-backend/src/main/native/haskell-backend: 4fb83523 - Fix `variable` to `RewritingVariableName` in `Kore.Equation.Application` (runtimeverification#2325) * haskell-backend/src/main/native/haskell-backend: f41cba23 - Revert "Revert runtimeverification#2315 (runtimeverification#2385)" (runtimeverification#2389) * haskell-backend/src/main/native/haskell-backend: 44eed8d7 - Run Test workflow on macOS (runtimeverification#2420) * haskell-backend/src/main/native/haskell-backend: 904f5322 - kore-repl: Print human-readable error messages (runtimeverification#2441) * haskell-backend/src/main/native/haskell-backend: b49fdd3c - Make Conditional's term a strict field (runtimeverification#2442) * haskell-backend/src/main/native/haskell-backend: 01f0402d - adding match for And (runtimeverification#2435) * haskell-backend/src/main/native/haskell-backend: 3243d1e5 - kore-0.41.0.0 (runtimeverification#2444) * haskell-backend/src/main/native/haskell-backend: 28913344 - Update dependency: deps/k_release * haskell-backend/src/main/native/haskell-backend: abf0292b - Use unit and element symbol attributes * haskell-backend/src/main/native/haskell-backend: 7d3ee1bc - Inefficient Equation renaming (runtimeverification#2438) * haskell-backend/src/main/native/haskell-backend: 95b6c107 - Stop simplifying the left-hand side of equations (runtimeverification#2392) * haskell-backend/src/main/native/haskell-backend: 21959d95 - Add instructions for running one test in Docker (runtimeverification#2456) * haskell-backend/src/main/native/haskell-backend: 4195d948 - Removes sort checks for Map and Set during internalization (runtimeverification#2440) * Predicates in the condition are now simplified * haskell-backend/src/main/native/haskell-backend: c35bfa56 - Remove defined marker (runtimeverification#2380) * haskell-backend/src/main/native/haskell-backend: 57ad3292 - Remove cabal.project.freeze (runtimeverification#2450) * haskell-backend/src/main/native/haskell-backend: 66158c67 - Support the --bug-report and --no-bug-report options in kore-repl (#2462) * haskell-backend/src/main/native/haskell-backend: f0d93ac5 - Use stderr for errors (runtimeverification#2458) * haskell-backend/src/main/native/haskell-backend: 0427fae7 - Distinguish \bottom from stuck states (runtimeverification#2451) * haskell-backend/src/main/native/haskell-backend: d136446e - Fix Strict performance (runtimeverification#2447) * haskell-backend/src/main/native/haskell-backend: a4e55b2a - Remove IMP fragment tests (runtimeverification#2467) * haskell-backend/src/main/native/haskell-backend: 1f61e5a6 - Revert PRs related to InternalAc, Unit, Element & Concat symbols changes (runtimeverification#2463) * haskell-backend/src/main/native/haskell-backend: fcfc2d52 - Remove the EvaluatedF marker from TermLike (runtimeverification#2469) * haskell-backend/src/main/native/haskell-backend: fb56d719 - Revert PR runtimeverification#2334 (runtimeverification#2473) * haskell-backend/src/main/native/haskell-backend: bb258f14 - Add ref = "main"; to default.nix (runtimeverification#2475) * haskell-backend/src/main/native/haskell-backend: 964e64e7 - Update dependency: deps/k_release (runtimeverification#2464) * haskell-backend/src/main/native/haskell-backend: abf14770 - Emit a warning when kore-exec exceeds the depth limit (runtimeverification#2461) * haskell-backend/src/main/native/haskell-backend: 003a8424 - Update dependency: deps/k_release (runtimeverification#2478) * haskell-backend/src/main/native/haskell-backend: 485bd89a - kore-0.42.0.0 (runtimeverification#2477) * Add definedness to lookup rules, regenerate tests * haskell-backend/src/main/native/haskell-backend: 78515d10 - Update dependency: deps/k_release (runtimeverification#2486) * Revert changes to domains.md and test output * haskell-backend/src/main/native/haskell-backend: 4f3a751c - Format code with fourmolu (runtimeverification#2382) * haskell-backend/src/main/native/haskell-backend: de80594b - Update dependency: deps/k_release (runtimeverification#2490) * Update map symbolic Haskell tests * haskell-backend/src/main/native/haskell-backend: 9c9ef914 - Update dependency: deps/k_release (runtimeverification#2495) Co-authored-by: ana-pantilie <[email protected]> Co-authored-by: Thomas Tuegel <[email protected]>
Motivation
This is the binding restriction on
:=K
:This feature would make it possible to describe View Patterns in K. The link is for haskell but has motivating examples. I am unsure what a special syntax sugar for such patterns would be but it also doesn't matter too much since using
:=K
is already pretty quiet.My motivating use case for this is pattern matching on bitstrings. @ehildenb tells me that the Plutus semantics share this use case with me. Consider bitpatterns in erlang. Say I want to write some binary decoding logic for a machine language. In Erlang I can write something like this:
In Haskell, with a bit of work to define the
bits
ViewPattern, I can write it like this:However to define a similar function in K, I have to figure out how to encode the match myself as a combination of
&Int
and==Int
so that I can "lift" it to the outer level. I can't call abits
function on the input, pattern match on the result, and keep trying otherdecode
patterns if that match fails.Example K Code
Suppose K allowed us to bind variables with
:=K
. This function could look something like this:It is also worth mentioning that this feature would also enable a simple syntactic sugar for
where
clauses ala #1685:translates directly into
This would also allow
PAT
to be more complicated than a single variable.Documentation
Remove the sentences about the restriction from the documentation of the pattern matching operator. Under the same section, a new paragraph like this could be added:
Potential Alternatives/Work-arounds
Work-arounds for this feature tend to be very use-specific and involve brittle utilities, code duplication, or both. It becomes necessary to write the logic associated with the view pattern manually, losing out on the benefits of built-in pattern matching in K.
I think it might be possible to emulate the continue-on-fail behavior of a regular pattern match in K today with the
#STUCK
strategy, by I haven't tried that as it would be far more confusing and hard to understand than the custom logic for pattern matching in my case.The text was updated successfully, but these errors were encountered: