diff --git a/AlgebraicDataflowArchitectureModel/models/Algo.model b/AlgebraicDataflowArchitectureModel/models/Algo.model new file mode 100644 index 0000000..9b7ad03 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/Algo.model @@ -0,0 +1,20 @@ +channel turnA{ + ref handsB(b:List, drawA(target:Int, guess:Int, b, d:List)) + ref deck(d:List, drawA(target, guess, b, d)) + + out handsA(a:List, drawA(target, guess, b, d)) == if(eq(get(b, target), guess), cons(tuple(fst(head(d)),false), a), cons(tuple(fst(head(d)), true), a)) + out handsB(a:List, drawA(target, guess, b, d)) == if(eq(get(b, target), guess), set(a, target, tuple(fst(get(a, target)), true)), a) + out deck(t:List, drawA(target, guess, b, d)) == tail(d) + +} + +channel turnB{ + +} +channel turnAA{ + + ref handsB(b:List, selectA(target:Int, guess:Int, attacker:Int, b)) + + out handsA(a:List, selectA(target, guess, attacker, b)) == if(eq(get(b, target), guess), a, set(a, attacker, tuple(fst(get(a, attacker)), true))) + out handsB(a:List, selectA(target, guess, attacker, b)) == if(eq(get(b, target), guess), set(a, target, tuple(fst(get(a, target)), true)), a) +} diff --git a/AlgebraicDataflowArchitectureModel/models/ModTest b/AlgebraicDataflowArchitectureModel/models/ModTest new file mode 100644 index 0000000..0a30dc0 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/models/ModTest @@ -0,0 +1,13 @@ +init{ + deck := nil + +} +channel CIO { + out deck(s, input(x)) == x + out deck(p:List, inp(x:Tuple)) == cons(x, sortCard(cons(x, p))) + out geck(p:Int, inp(x:Tuple)) == length(sortCard(cons(x, p))) +} +channel C{ + +} + diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index 79f8fe0..ab79447 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -36,6 +36,33 @@ public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "($x,$y)->$x.add(0, $y)", Symbol.Type.LAMBDA_WITH_SIDE_EFFECT, new int[] {1, 0}); public static final Symbol head = new Symbol("head", 1, Symbol.Type.PREFIX, "($x)->$x.get(0)", Symbol.Type.LAMBDA); public static final Symbol tail = new Symbol("tail", 1, Symbol.Type.PREFIX, "($x)->$x.subList(1, $x.size())", Symbol.Type.LAMBDA); + public static final Symbol extractFaceDown = new Symbol("extractFaceDown", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { + @Override + public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { + return children[0]+".stream().filter(item -> item.getValue()==false).collect(Collectors.toList())"; + } + }); + public static final Symbol sortCard = new Symbol("sortCard", 1, Symbol.Type.PREFIX, new Symbol.IImplGenerator() { + @Override + public String generate(Type type, String[] children, String[] childrenSideEffects, String[] sideEffect) { + String compType = ""; + String temp_sort="temp_sort"; + if (type != null) { + String interfaceType = type.getInterfaceTypeName(); + if (interfaceType.contains("<")) { + compType = interfaceType.substring(interfaceType.indexOf("<") + 1, interfaceType.lastIndexOf(">")); + } + String implType = type.getImplementationTypeName(); + if (implType.indexOf('<') >= 0) { + implType = implType.substring(0, implType.indexOf('<')); + } + + } + temp_sort=children[0]+".sort(Comparator.comparing("+compType+"::getKey));\n"; + return temp_sort; + } + },true); + public static final Symbol length = new Symbol("length", 1, Symbol.Type.PREFIX, "($x)->$x.size()", Symbol.Type.LAMBDA); public static final Symbol get = new Symbol("get", 2, Symbol.Type.PREFIX, "get", Symbol.Type.METHOD); public static final Symbol set = new Symbol("set", 3, Symbol.Type.PREFIX, "set", Symbol.Type.METHOD_WITH_SIDE_EFFECT); public static final Symbol contains = new Symbol("contains", 2, Symbol.Type.PREFIX, "contains", Symbol.Type.METHOD); @@ -81,6 +108,8 @@ return temp; } }); + + public static final Symbol mod = new Symbol("mod", 2, Symbol.Type.PREFIX, "%", Symbol.Type.INFIX); public static final Symbol eq = new Symbol("eq", 2, Symbol.Type.PREFIX, "==", Symbol.Type.INFIX); public static final Symbol neq = new Symbol("neq", 2, Symbol.Type.PREFIX, "!=", Symbol.Type.INFIX); @@ -134,6 +163,8 @@ cons.setInverses(new Symbol[] {head, tail}); cons.setSignature(new Type[] {typeList, null, typeList}); contains.setSignature(new Type[] {typeBoolean, typeList, null}); + extractFaceDown.setSignature(new Type[] {typeList, null}); + length.setSignature(new Type[] {typeInt, null}); get.setSignature(new Type[] {null, typeList, typeInt}); set.setSignature(new Type[] {typeList, typeList, typeInt, null}); eq.setSignature(new Type[] {typeBoolean, null, null}); @@ -185,6 +216,9 @@ addSymbol(cons); addSymbol(head); addSymbol(tail); + addSymbol(extractFaceDown); + addSymbol(length); + addSymbol(sortCard); addSymbol(contains); addSymbol(get); addSymbol(set);