/** * 比较两个term是否相同 * @param _lhs * @param _rhs * @return bool */ bool Utils::compareTerm(const _term* _lhs, const _term* _rhs) { assert(_lhs); assert(_rhs); if (_lhs->term_type != _rhs->term_type) { return false; } int k; switch (_lhs->term_type) { case VARI: return (_lhs->variable_id == _rhs->variable_id); case FUNC: if (_lhs->function_id == _rhs->function_id) { k = Vocabulary::instance().getFunctionArity(_lhs->function_id) - 1; assert(k < 0 || _lhs->parameters); assert(k < 0 || _rhs->parameters); for ( ; k >= 0; -- k) { if (! compareTerm(_lhs->parameters + k, _rhs->parameters + k)) { return false; } } return true; } default: assert(0); } return false; }
/** * 比较两条公式是否相同 * @param _lhs * @param _rhs * @return bool */ bool Utils::compareFormula(const _formula* _lhs, const _formula* _rhs) { assert(_lhs); assert(_rhs); if (_lhs->formula_type!=_rhs->formula_type) { return false; } int k; switch (_lhs->formula_type) { case ATOM: if (_lhs->predicate_id!=_rhs->predicate_id) { return false; } k = Vocabulary::instance().getPredicateArity(_lhs->predicate_id) - 1; assert(k < 0 || _lhs->parameters); assert(k < 0 || _rhs->parameters); for ( ; k >= 0; -- k) { if (! compareTerm(_lhs->parameters + k,_rhs->parameters + k)) { return FALSE; } } return true; case UNIV: case EXIS: if (_lhs->variable_id!=_rhs->variable_id) { return false; } case NEGA: assert(_lhs->subformula_l); assert(_rhs->subformula_l); return compareFormula(_lhs->subformula_l,_rhs->subformula_l); case CONJ: case DISJ: case IMPL: assert(_lhs->subformula_l); assert(_rhs->subformula_l); assert(_lhs->subformula_r); assert(_rhs->subformula_r); return (compareFormula(_lhs->subformula_l,_rhs->subformula_l) && compareFormula(_lhs->subformula_r,_rhs->subformula_r)); default: assert(0); } return false; }
comparison sliceCmp(specialClassPo cl, termPo o1, termPo o2) { listPo l1 = C_LIST(o1); listPo l2 = C_LIST(o2); integer s1 = listSize(l1); integer s2 = listSize(l2); integer sz = minimum(s1, s2); for (integer ix = 0; ix < sz; ix++) { termPo e1 = nthEl(l1, ix); termPo e2 = nthEl(l2, ix); comparison cmp = compareTerm(e1, e2); if (cmp != same) return cmp; } if (s1 < s2) return smaller; else if (s1 > s2) return bigger; else return same; }
logical sameTerm(termPo t1, termPo t2) { return (logical) (compareTerm(t1, t2) == same); }
comparison cellCmp(specialClassPo cl, termPo o1, termPo o2) { cellPo c1 = C_CELL(o1); cellPo c2 = C_CELL(o2); return compareTerm(c1->content, c2->content); }