diff options
| author | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-10-12 10:07:07 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud.bailly@iohk.io> | 2024-10-12 10:07:07 +0200 |
| commit | 0ab73e47af2bba3fb2ff6a4bf08ada4a3309bf3e (patch) | |
| tree | 05e2b9ebd60e5c8175f086e1de73657032d9c2fc /java/LCEvaluator.java | |
| parent | 3363ab2da764825558c859f4419ff99528ed2274 (diff) | |
| download | lambda-nantes-0ab73e47af2bba3fb2ff6a4bf08ada4a3309bf3e.tar.gz | |
Add java evaluator
Diffstat (limited to 'java/LCEvaluator.java')
| -rw-r--r-- | java/LCEvaluator.java | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/java/LCEvaluator.java b/java/LCEvaluator.java new file mode 100644 index 0000000..b0fe69b --- /dev/null +++ b/java/LCEvaluator.java @@ -0,0 +1,59 @@ +package org.lambdanantes.lcgoji; + +import org.lambdanantes.lcgoji.ast.Abs; +import org.lambdanantes.lcgoji.ast.App; +import org.lambdanantes.lcgoji.ast.Term; +import org.lambdanantes.lcgoji.ast.Var; + +import static org.lambdanantes.lcgoji.ast.Abs.λ; +import static org.lambdanantes.lcgoji.ast.App.apply; + +public class LCEvaluator { + + public static Term evaluate(Term term) { + switch (term) { + case Var var -> { + return var; + } + case Abs abs -> { + return abs; + } + case App app -> { + switch (app.left) { + case Abs abs -> { + return substitute(abs.body, abs.arg, app.right); + } + case App _app -> { + return app; + } + case Var _var -> { + return app; + } + } + } + } + } + + private static Term substitute(Term body, String arg, Term val) { + switch (body) { + case Var var -> { + if (var.name.equals(arg)) { + return val; + } else { + return body; + } + } + case App app -> { + return apply(substitute(app.left, arg, val), substitute(app.right, arg, val)); + } + case Abs abs -> { + if (abs.arg.equals(arg)) { + // Pas de substitution des variables redéfinies + return abs; + } else { + return λ(abs.arg, substitute(abs.body, arg, val)); + } + } + } + } +}
\ No newline at end of file |
