summaryrefslogtreecommitdiff
path: root/java/LCEvaluator.java
diff options
context:
space:
mode:
authorArnaud Bailly <arnaud.bailly@iohk.io>2024-10-12 10:07:07 +0200
committerArnaud Bailly <arnaud.bailly@iohk.io>2024-10-12 10:07:07 +0200
commit0ab73e47af2bba3fb2ff6a4bf08ada4a3309bf3e (patch)
tree05e2b9ebd60e5c8175f086e1de73657032d9c2fc /java/LCEvaluator.java
parent3363ab2da764825558c859f4419ff99528ed2274 (diff)
downloadlambda-nantes-0ab73e47af2bba3fb2ff6a4bf08ada4a3309bf3e.tar.gz
Add java evaluator
Diffstat (limited to 'java/LCEvaluator.java')
-rw-r--r--java/LCEvaluator.java59
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