Ejemplo n.º 1
0
    def rpni(self, pos_examples, neg_examples):
        dfa = DFA.from_word_list(pos_examples, self.alphabet)
        self.reds = {dfa.start}
        self.blues = {
            next_state
            for token, next_state in dfa.transitions[dfa.start].items()
        }
        self.draw(dfa=dfa, operation='pta')

        while len(self.blues) > 0:
            temp_dfa = 0
            blue = choose(dfa, self.blues)
            for red in list(self.reds):
                temp_dfa = self.rpni_merge(deepcopy(dfa), red, blue)
                if rpni_compatible(temp_dfa, neg_examples):
                    # print('compatible')
                    break
                temp_dfa = 0

            if temp_dfa != 0:
                if blue in self.blues:
                    self.blues.remove(blue)
                dfa = temp_dfa
                for r_state in self.reds:
                    for token, next_state in dfa.transitions[r_state].items():
                        if next_state not in self.reds:
                            self.blues.add(next_state)
                self.draw(dfa=dfa, operation='merge')
            else:
                self.rpni_promote(dfa, blue)
                self.draw(dfa=dfa, operation='promoted')
        return dfa
Ejemplo n.º 2
0
def learn_dfa(teacher, num_examples):

    for i in range(num_examples):
        teacher.example()
    examples = teacher.used_examples
    pos_examples = [ex[0] for ex in examples if ex[1] == '+']
    neg_examples = [ex[0] for ex in examples if ex[1] == '-']
    pta = DFA.from_word_list(pos_examples, alphabet)
    return pta