forked from JavaTX/JavaCompilerCore
Oder-Constraints generieren
This commit is contained in:
parent
277dac20e7
commit
10be0b17e9
@ -23,6 +23,7 @@ public class Clingo {
|
||||
programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/unify.lp"));
|
||||
programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/result.lp"));
|
||||
programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/adapt.lp"));
|
||||
programFiles.add(new File("/home/janulrich/Sync/HiwiJob/ResearchPapers/MasterarbeitStadelmeier/asp/unifyWithoutWildcards/cartesian.lp"));
|
||||
}
|
||||
|
||||
public Clingo(List<File> inputFiles){
|
||||
|
@ -8,7 +8,10 @@ public enum ASPRule {
|
||||
ASP_PARAMLIST_END_POINTER("null"),
|
||||
ASP_TYPE("type"),
|
||||
ASP_FCTYPE("typeFC"),
|
||||
ASP_TYPE_VAR("typeVar");
|
||||
ASP_TYPE_VAR("typeVar"), ASP_ODER("oder"),
|
||||
ASP_CONSTRAINT("constraint"),
|
||||
ASP_LIST_NAME("list"),
|
||||
ASP_LIST_ENDPOINTER("null");
|
||||
|
||||
private final String text;
|
||||
|
||||
|
@ -24,23 +24,71 @@ public class ASPFactory implements TypeVisitor<String>{
|
||||
for(Pair p : constraints.getUndConstraints()){
|
||||
factory.convertPair(p);
|
||||
}
|
||||
for(Set<Constraint<Pair>> constraint : constraints.getOderConstraints()){
|
||||
for(Constraint<Pair> oder : constraint){
|
||||
factory.convertOderConstraint(oder);
|
||||
}
|
||||
for(Set<Constraint<Pair>> oder : constraints.getOderConstraints()){
|
||||
factory.convertOderConstraint(oder);
|
||||
}
|
||||
|
||||
return factory.writer.getASPFile();
|
||||
}
|
||||
|
||||
private void convertOderConstraint(Constraint<Pair> oder) {
|
||||
throw new NotImplementedException();
|
||||
/**
|
||||
* Wandelt eine Reihe von Constraints zu einem Und-Constraint - also einer Liste - um.
|
||||
* Dieser kann dann in Oder-Constraints verwendet werden.
|
||||
* @param undCons - Eine Liste von Constraints. Bsp: equals(..), smallerDot(..)
|
||||
* @return - list(equals, list(smallerDot(..., null)
|
||||
*/
|
||||
protected ASPStatement convertListToUndConstraint(List<ASPStatement> undCons) {
|
||||
if(undCons.size() == 0)throw new NullPointerException();
|
||||
if(undCons.size() == 1){
|
||||
return undCons.get(0);
|
||||
}
|
||||
ASPStatement list = makeStatement(ASPRule.ASP_LIST_ENDPOINTER.toString());
|
||||
for(ASPStatement con : undCons){
|
||||
list = makeStatement(ASPRule.ASP_LIST_NAME.toString(), con.getASP(), list.getASP());
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
ASPWriter writer = new ASPWriter();
|
||||
protected ASPStatement convertListToUndConstraint(Constraint<Pair> undCons) {
|
||||
List<ASPStatement> convert = new ArrayList<>();
|
||||
for(Pair p : undCons){
|
||||
convert.add(generatePairStmt(p));
|
||||
}
|
||||
return convertListToUndConstraint(convert);
|
||||
}
|
||||
|
||||
protected void convertOderConstraint(Set<Constraint<Pair>> oder) {
|
||||
if(oder.size() < 2)throw new NotImplementedException();
|
||||
List<ASPStatement> ret = new ArrayList<>();
|
||||
Iterator<Constraint<Pair>> it = oder.iterator();
|
||||
String pointer1 = ASPStringConverter.toConstant(NameGenerator.makeNewName());
|
||||
ASPStatement stmt = makeStatement(ASPRule.ASP_CONSTRAINT.toString(), pointer1,
|
||||
convertListToUndConstraint(it.next()).getASP());
|
||||
ret.add(stmt);
|
||||
while(it.hasNext()){
|
||||
String pointer2 = ASPStringConverter.toConstant(NameGenerator.makeNewName());
|
||||
Constraint<Pair> cons = it.next();
|
||||
stmt = makeStatement(ASPRule.ASP_CONSTRAINT.toString(), pointer2,
|
||||
convertListToUndConstraint(cons).getASP());
|
||||
ret.add(stmt);
|
||||
ASPStatement oderStmt = makeStatement(ASPRule.ASP_ODER.toString(), pointer1, pointer2);
|
||||
if(it.hasNext()){
|
||||
String oderPointer = ASPStringConverter.toConstant(NameGenerator.makeNewName());
|
||||
stmt = makeStatement(ASPRule.ASP_CONSTRAINT.toString(), oderPointer, oderStmt.getASP());
|
||||
ret.add(stmt);
|
||||
pointer1 = oderPointer;
|
||||
}else{
|
||||
ret.add(oderStmt);
|
||||
}
|
||||
}
|
||||
//Alle erstellten Constraints schreiben:
|
||||
writer.addAll(ret);
|
||||
}
|
||||
|
||||
protected ASPWriter writer = new ASPWriter();
|
||||
boolean isFCType = false;
|
||||
|
||||
private void convertFC(Collection<ClassOrInterface> classes) throws ClassNotFoundException {
|
||||
protected void convertFC(Collection<ClassOrInterface> classes) throws ClassNotFoundException {
|
||||
Set<Pair> fc = FCGenerator.toFC(classes);
|
||||
isFCType = true;
|
||||
for(Pair fcp : fc){
|
||||
@ -49,7 +97,12 @@ public class ASPFactory implements TypeVisitor<String>{
|
||||
isFCType = false;
|
||||
}
|
||||
|
||||
private void convertPair(Pair p){
|
||||
protected void convertPair(Pair p){
|
||||
ASPStatement pairStmt = generatePairStmt(p);
|
||||
writer.add(pairStmt);
|
||||
}
|
||||
|
||||
protected ASPStatement generatePairStmt(Pair p) {
|
||||
String ls = p.TA1.acceptTV(this);
|
||||
String rs = p.TA2.acceptTV(this);
|
||||
ASPStatement pairStmt = null;
|
||||
@ -60,10 +113,10 @@ public class ASPFactory implements TypeVisitor<String>{
|
||||
}else if(p.GetOperator().equals(PairOperator.SMALLER)){
|
||||
pairStmt = makeStatement(ASPRule.ASP_PAIR_SMALLER_NAME.toString(), ls, rs);
|
||||
}else throw new NotImplementedException();
|
||||
writer.add(pairStmt);
|
||||
return pairStmt;
|
||||
}
|
||||
|
||||
private ASPStatement makeStatement(String rule, String... params){
|
||||
protected ASPStatement makeStatement(String rule, String... params){
|
||||
String stmt = rule + "(";
|
||||
for(String param : params){
|
||||
stmt += param + ",";
|
||||
@ -73,7 +126,7 @@ public class ASPFactory implements TypeVisitor<String>{
|
||||
return new ASPStatement(stmt);
|
||||
}
|
||||
|
||||
private String convertParameterlist(List<String> pointers){
|
||||
protected String convertParameterlist(List<String> pointers){
|
||||
String pointer = ASPStringConverter.toConstant(NameGenerator.makeNewName());
|
||||
Iterator<String> it = pointers.iterator();
|
||||
String p = pointer;
|
||||
|
@ -77,6 +77,24 @@ public class UnifyWithoutWildcards {
|
||||
assert resultSet.results.size()==1;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void oderConstraintTest() throws InterruptedException, IOException, ClassNotFoundException {
|
||||
ConstraintSet<Pair> testSet = new ConstraintSet<>();
|
||||
TypePlaceholder t1 = TypePlaceholder.fresh(new NullToken());
|
||||
RefType t2 = new RefType(new JavaClassName("java.lang.Object"), new ArrayList<>(), new NullToken());
|
||||
RefType t3 = new RefType(new JavaClassName("asp.UnifyWithoutWildcards$Test2"), new ArrayList<>(), new NullToken());
|
||||
Set<Constraint<Pair>> oderCons = new HashSet<>();
|
||||
Constraint<Pair> cons1 = new Constraint<>();
|
||||
cons1.add(new Pair(t1, t2, PairOperator.EQUALSDOT));
|
||||
oderCons.add(cons1);
|
||||
Constraint<Pair> cons2 = new Constraint<>();
|
||||
cons2.add(new Pair(t1, t3, PairOperator.EQUALSDOT));
|
||||
oderCons.add(cons2);
|
||||
testSet.addOderConstraint(oderCons);
|
||||
ResultSet resultSet = run(testSet, getFC());
|
||||
assert resultSet.results.size() == 1;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void oderConstraints() throws InterruptedException, IOException, ClassNotFoundException {
|
||||
ConstraintSet<Pair> testSet = new ConstraintSet<>();
|
||||
@ -95,7 +113,7 @@ public class UnifyWithoutWildcards {
|
||||
testSet.addOderConstraint(oderCons);
|
||||
}
|
||||
ResultSet resultSet = run(testSet, getFC());
|
||||
System.out.println(resultSet.results.size());
|
||||
assert resultSet.results.size() == 1;
|
||||
}
|
||||
|
||||
public ResultSet run(ConstraintSet<Pair> toTest, Collection<ClassOrInterface> fc) throws IOException, InterruptedException, ClassNotFoundException {
|
||||
|
45
test/asp/unifywithoutwildcards/ASPFactoryTest.java
Normal file
45
test/asp/unifywithoutwildcards/ASPFactoryTest.java
Normal file
@ -0,0 +1,45 @@
|
||||
package asp.unifywithoutwildcards;
|
||||
|
||||
import de.dhbwstuttgart.parser.NullToken;
|
||||
import de.dhbwstuttgart.sat.asp.writer.ASPFactory;
|
||||
import de.dhbwstuttgart.sat.asp.writer.ASPStatement;
|
||||
import de.dhbwstuttgart.syntaxtree.type.TypePlaceholder;
|
||||
import de.dhbwstuttgart.typeinference.constraints.Constraint;
|
||||
import de.dhbwstuttgart.typeinference.constraints.Pair;
|
||||
import de.dhbwstuttgart.typeinference.unify.model.PairOperator;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class ASPFactoryTest extends ASPFactory {
|
||||
@Test
|
||||
public void undConstraintTest(){
|
||||
TypePlaceholder tph = TypePlaceholder.fresh(new NullToken());
|
||||
Constraint<Pair> toTest = new Constraint();
|
||||
for(int i = 0; i<5;i++){
|
||||
toTest.add(new Pair(tph, tph, PairOperator.EQUALSDOT));
|
||||
}
|
||||
List<ASPStatement> undCons = new ArrayList<>();
|
||||
for(Pair p : toTest){
|
||||
undCons.add(generatePairStmt(p));
|
||||
}
|
||||
ASPStatement ret = convertListToUndConstraint(undCons);
|
||||
System.out.println(ret.getASP());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void oderConstraintTest(){
|
||||
TypePlaceholder tph = TypePlaceholder.fresh(new NullToken());
|
||||
Set<Constraint<Pair>> oderTest = new HashSet<>();
|
||||
for(int i = 0; i<5;i++){
|
||||
Constraint<Pair> toTest = new Constraint();
|
||||
toTest.add(new Pair(tph, tph, PairOperator.EQUALSDOT));
|
||||
oderTest.add(toTest);
|
||||
}
|
||||
this.convertOderConstraint(oderTest);
|
||||
System.out.println(this.writer.getASPFile());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user