package org.rascalmpl.library.analysis.formalconcepts;
import java.util.Iterator;
import org.rascalmpl.value.ISet;
import org.rascalmpl.value.ISetRelation;
import org.rascalmpl.value.ISetWriter;
import org.rascalmpl.value.IValue;
import org.rascalmpl.value.IValueFactory;
public class FCA {
private final IValueFactory vf;
public FCA(IValueFactory vf) {
this.vf = vf;
}
// rel[&Object, &Attribute] fc, set[&Object] objects
public ISet sigma(ISet fc, ISet objects) {
ISetRelation<ISet> fcRelation = fc.asRelation();
if (objects.isEmpty()) {
return fcRelation.range();
}
ISetWriter result = vf.setWriter();
for (Iterator<IValue> attributes = fcRelation.range().iterator(); attributes.hasNext();) {
IValue attr = attributes.next();
boolean all = true;
for (Iterator<IValue> objs = objects.iterator(); objs.hasNext();) {
IValue obj = objs.next();
all &= fc.contains(vf.tuple(obj, attr));
if (!all) {
break;
}
}
if (all) {
result.insert(attr);
}
}
return result.done();
}
//set[&Attribute] sigma(FormalContext[&Object, &Attribute] fc, set[&Object] objects)
// = objects == {} ? fc<1> : { a | a <- fc<1>, all(obj <- objects, <obj,a> in fc)};
//
//set[&Object] tau(FormalContext[&Object, &Attribute] fc, set[&Attributes] attributes)
// = attributes == {} ? fc<0> : { ob | ob <- fc<0>, all(a <- attributes, <ob, a> in fc)};
public ISet tau(ISet fc, ISet attributes) {
ISetRelation<ISet> fcRelation = fc.asRelation();
if (attributes.isEmpty()) {
return fcRelation.domain();
}
ISetWriter result = vf.setWriter();
for (Iterator<IValue> objs = fcRelation.domain().iterator(); objs.hasNext();) {
IValue obj= objs.next();
boolean all = true;
for (Iterator<IValue> attrs = attributes.iterator(); attrs.hasNext();) {
IValue attr = attrs.next();
all &= fc.contains(vf.tuple(obj, attr));
if (!all) {
break;
}
}
if (all) {
result.insert(obj);
}
}
return result.done();
}
}