private TransitionGraph<Role> buildNondeterministicFSM(final Role s, final Set<Role> visited) final TransitionGraph<Role> tg = new TransitionGraph<>(); final State<Role> i = tg.newState(); final State<Role> f = tg.newState(); tg.setInitialState(i); tg.addFinalState(f); tg.addTransition(i, s, f); tg.addTransition(i, sub, f); return null; final Set<Role> alphabet = new HashSet<>(tg.getAlpahabet()); for (final Role r : alphabet) for (final Pair<State<Role>, State<Role>> pair : tg.findTransitions(r)) if (tg.isInitial(pair.first) || tg.isFinal(pair.second) || tg.isFinal(pair.first) && tg.isInitial(pair.second)) continue; else return null; tg.insert(newGraph, pair.first, pair.second);
assert tg.isConnected(); _logger.fine("Determinize " + s + ": " + tg.size() + "\n" + tg); tg.determinize(); assert tg.isConnected(); assert tg.isDeterministic(); _logger.fine("Minimize NFA for " + s + ": " + tg.size() + "\n" + tg); tg.minimize(); _logger.fine("Minimized NFA for " + s + ": " + tg.size() + "\n" + tg); assert tg.isConnected(); tg.renumber(); _logger.fine("Renumbered " + s + ": " + tg.size() + "\n" + tg); assert tg.isConnected(); setFSM(s.getInverse(), mirror(tg).determinize().renumber());
public Set<State<T>> epsilonClosure(final Set<State<T>> stateSet) { Set<State<T>> result = new HashSet<>(); // for each state in SS add their epsilon closure to the result for (final State<T> s : stateSet) result = epsilonClosure(s, result); return result; }
private TransitionGraph<Role> mirror(final TransitionGraph<Role> tg) { final Map<State<Role>, State<Role>> newStates = new HashMap<>(); final TransitionGraph<Role> mirror = new TransitionGraph<>(); final State<Role> oldInitialState = tg.getInitialState(); final State<Role> newFinalState = copyState(oldInitialState, mirror, newStates); mirror.addFinalState(newFinalState); final Set<State<Role>> oldFinalStates = tg.getFinalStates(); State<Role> newInitialState = null; if (oldFinalStates.size() == 1) { final State<Role> oldFinalState = oldFinalStates.iterator().next(); newInitialState = newStates.get(oldFinalState); } else { newInitialState = mirror.newState(); for (final State<Role> oldFinalState : oldFinalStates) mirror.addTransition(newInitialState, newStates.get(oldFinalState)); } mirror.setInitialState(newInitialState); return mirror; }
private void addRoleChainTransition(final TransitionGraph<Role> tg, final State<Role> initialState, final State<Role> finalState, final ATermList list, final int length) { State<Role> prev = initialState; ATermList chain = list; for (int i = 0; i < length; i++, chain = chain.getNext()) { final Role role = _rbox.getRole(chain.getFirst()); final State<Role> next = i == length - 1 ? finalState : tg.newState(); tg.addTransition(prev, role, next); prev = next; } }
newStates.put(tg.getInitialState(), i); for (final State<T> fs : tg.getFinalStates()) newStates.put(fs, f); if (n1 == null) n1 = newState(); newStates.put(s1, n1); if (n2 == null) n2 = newState(); newStates.put(s2, n2);
Set<State<T>> ss = epsilonClosure(_initialState, new HashSet<State<T>>()); U = epsilonClosure(move(ss, a)); if (isAnyFinal(ss)) acceptingStates.add(s);
@Override public void getObjectPropertyValues(final ATermAppl s, final Role role, final Set<ATermAppl> knowns, final Set<ATermAppl> unknowns, final boolean getSames) { assert isComplete() : "Initial consistency check has not been performed!"; Individual subj = getIndividual(s); boolean isIndependent = true; if (subj.isMerged()) { isIndependent = subj.getMergeDependency(true).isIndependent(); subj = subj.getSame(); } if (role.isSimple()) getSimpleObjectPropertyValues(subj, role, knowns, unknowns, getSames); else if (!role.hasComplexSubRole()) getTransitivePropertyValues(subj, role, knowns, unknowns, getSames, new HashMap<Individual, Set<Role>>(), true); else { final TransitionGraph<Role> tg = role.getFSM(); getComplexObjectPropertyValues(subj, tg.getInitialState(), tg, knowns, unknowns, getSames, new HashMap<Individual, Set<State<Role>>>(), true); } if (!isIndependent) { unknowns.addAll(knowns); knowns.clear(); } }
private boolean addRoleChainTransition(final TransitionGraph<Role> tg, final Role s, final ATermList chain) { final Role firstRole = _rbox.getRole(chain.getFirst()); final Role lastRole = _rbox.getRole(chain.getLast()); final boolean firstRoleSame = s.isEquivalent(firstRole); final boolean lastRoleSame = s.isEquivalent(lastRole); final int length = chain.getLength(); if (firstRoleSame) { if (lastRoleSame && length != 2) return false; addRoleChainTransition(tg, tg.getFinalState(), tg.getFinalState(), chain.getNext(), length - 1); } else if (lastRoleSame) addRoleChainTransition(tg, tg.getInitialState(), tg.getInitialState(), chain, length - 1); else addRoleChainTransition(tg, tg.getInitialState(), tg.getFinalState(), chain, length); return true; }
protected boolean interactsWithInversesComplex(final KnowledgeBase kb, final Role role) { for (final ATermAppl p : _expressivity.getAnonInverses()) { final Role anonRole = kb.getRole(p); if (anonRole.hasComplexSubRole() && anonRole.getFSM().getAlpahabet().contains(role)) return true; } return false; }
private TransitionGraph<Role> mirror(final TransitionGraph<Role> tg) { final Map<State<Role>, State<Role>> newStates = new HashMap<>(); final TransitionGraph<Role> mirror = new TransitionGraph<>(); final State<Role> oldInitialState = tg.getInitialState(); final State<Role> newFinalState = copyState(oldInitialState, mirror, newStates); mirror.addFinalState(newFinalState); final Set<State<Role>> oldFinalStates = tg.getFinalStates(); State<Role> newInitialState = null; if (oldFinalStates.size() == 1) { final State<Role> oldFinalState = oldFinalStates.iterator().next(); newInitialState = newStates.get(oldFinalState); } else { newInitialState = mirror.newState(); for (final State<Role> oldFinalState : oldFinalStates) mirror.addTransition(newInitialState, newStates.get(oldFinalState)); } mirror.setInitialState(newInitialState); return mirror; }
newStates.put(tg.getInitialState(), i); for (final State<T> fs : tg.getFinalStates()) newStates.put(fs, f); if (n1 == null) n1 = newState(); newStates.put(s1, n1); if (n2 == null) n2 = newState(); newStates.put(s2, n2);
Set<State<T>> ss = epsilonClosure(_initialState, new HashSet<State<T>>()); U = epsilonClosure(move(ss, a)); if (isAnyFinal(ss)) acceptingStates.add(s);
private void addRoleChainTransition(final TransitionGraph<Role> tg, final State<Role> initialState, final State<Role> finalState, final ATermList list, final int length) { State<Role> prev = initialState; ATermList chain = list; for (int i = 0; i < length; i++, chain = chain.getNext()) { final Role role = _rbox.getRole(chain.getFirst()); final State<Role> next = i == length - 1 ? finalState : tg.newState(); tg.addTransition(prev, role, next); prev = next; } }
private static Bool checkAllValuesClash(final KnowledgeBase kb, final ATermAppl av, final CachedNode root, final CachedNode otherRoot) { ATerm r = av.getArgument(0); if (r.getType() == ATerm.LIST) r = ((ATermList) r).getFirst(); final Role role = kb.getRole(r); if (null == role) // FIXME : null is unexpected. return Bool.UNKNOWN; if (!role.hasComplexSubRole()) { if (otherRoot.hasRNeighbor(role)) { if (_logger.isLoggable(Level.FINE)) _logger.fine(root + " has " + av + " " + otherRoot + " has " + role + " _neighbor"); return Bool.UNKNOWN; } } else { final TransitionGraph<Role> tg = role.getFSM(); for (final Transition<Role> t : tg.getInitialState().getTransitions()) if (otherRoot.hasRNeighbor(t.getName())) { if (_logger.isLoggable(Level.FINE)) _logger.fine(root + " has " + av + " " + otherRoot + " has " + t.getName() + " _neighbor"); return Bool.UNKNOWN; } } return null; }
private boolean addRoleChainTransition(final TransitionGraph<Role> tg, final Role s, final ATermList chain) { final Role firstRole = _rbox.getRole(chain.getFirst()); final Role lastRole = _rbox.getRole(chain.getLast()); final boolean firstRoleSame = s.isEquivalent(firstRole); final boolean lastRoleSame = s.isEquivalent(lastRole); final int length = chain.getLength(); if (firstRoleSame) { if (lastRoleSame && length != 2) return false; addRoleChainTransition(tg, tg.getFinalState(), tg.getFinalState(), chain.getNext(), length - 1); } else if (lastRoleSame) addRoleChainTransition(tg, tg.getInitialState(), tg.getInitialState(), chain, length - 1); else addRoleChainTransition(tg, tg.getInitialState(), tg.getFinalState(), chain, length); return true; }
protected boolean interactsWithInversesComplex(final KnowledgeBase kb, final Role role) { for (final ATermAppl p : _expressivity.getAnonInverses()) { final Role anonRole = kb.getRole(p); if (anonRole.hasComplexSubRole() && anonRole.getFSM().getAlpahabet().contains(role)) return true; } return false; }
private TransitionGraph<Role> buildNondeterministicFSM(final Role s, final Set<Role> visited) final TransitionGraph<Role> tg = new TransitionGraph<>(); final State<Role> i = tg.newState(); final State<Role> f = tg.newState(); tg.setInitialState(i); tg.addFinalState(f); tg.addTransition(i, s, f); tg.addTransition(i, sub, f); return null; final Set<Role> alphabet = new HashSet<>(tg.getAlpahabet()); for (final Role r : alphabet) for (final Pair<State<Role>, State<Role>> pair : tg.findTransitions(r)) if (tg.isInitial(pair.first) || tg.isFinal(pair.second) || tg.isFinal(pair.first) && tg.isInitial(pair.second)) continue; else return null; tg.insert(newGraph, pair.first, pair.second);
assert tg.isConnected(); _logger.fine("Determinize " + s + ": " + tg.size() + "\n" + tg); tg.determinize(); assert tg.isConnected(); assert tg.isDeterministic(); _logger.fine("Minimize NFA for " + s + ": " + tg.size() + "\n" + tg); tg.minimize(); _logger.fine("Minimized NFA for " + s + ": " + tg.size() + "\n" + tg); assert tg.isConnected(); tg.renumber(); _logger.fine("Renumbered " + s + ": " + tg.size() + "\n" + tg); assert tg.isConnected(); setFSM(s.getInverse(), mirror(tg).determinize().renumber());
private State<Role> copyState(final State<Role> oldState, final TransitionGraph<Role> newTG, final Map<State<Role>, State<Role>> newStates) { State<Role> newState = newStates.get(oldState); if (newState == null) { newState = newTG.newState(); newStates.put(oldState, newState); for (final Transition<Role> t : oldState.getTransitions()) { final State<Role> oldTo = t.getTo(); final State<Role> newFrom = copyState(oldTo, newTG, newStates); if (t.isEpsilon()) newTG.addTransition(newFrom, newState); else newTG.addTransition(newFrom, t.getName().getInverse(), newState); } } return newState; } }