예제 #1
0
def expandToFuncApp(lib: FnLibrary, term: PPTerm, ntId: int,
                    fname: str) -> Optional[PPTerm]:
    resTerm = None
    # Not needed now as there are no lambda terms
    # libItem = ScopeUtils.getAVarInScope(lib, term, ntId, fname)
    libItem = lib.getWithLibPrefix(fname)
    assert libItem
    nt = ASTUtils.getNthNT(term, ntId)

    libItem = alphaConvertLibItem(libItem, term)
    # TODO: expandToVar passed nt.sort as second argument
    subst = unifyOne(nt.sort, libItem.sort.rtpe)

    if not gUseTypes:
        if subst is None:
            subst = []

    if subst is not None:
        nts = [PPTermNT('Z', arg_sort) for arg_sort in libItem.sort.args]
        fnApp = PPFuncApp(PPVar(libItem.name), nts)

        termUnified = applySubst(subst, term)
        fnAppUnified = applySubst(subst, fnApp)

        resTerm = ReprUtils.replaceNthNT(termUnified, ntId, fnAppUnified)

    return resTerm
예제 #2
0
def expandToUnk(term: PPTerm, ntId: int) -> Optional[PPTerm]:
    """
    Generate a new term by replacing a "ntId"th NT from a "term" with a PPTermUnk
    """
    nt = ASTUtils.getNthNT(term, ntId)

    # Avoid generating Unk of type PPDimConst, PPDimVar, PPEumSort, or PPInt()
    if isinstance(nt.sort, PPDimConst) or isinstance(nt.sort, PPDimVar) or isinstance(nt.sort, PPEnumSort) or \
            isinstance(nt.sort, PPInt):
        return None

    unk = ASTDSL.mkUnk(nt.sort)

    # subst = unifyOne(unk.sort, nt.sort)
    #
    # if subst != []:
    #     print("non empty subst")
    #
    # termExpanded = None
    # if subst is not None:
    #     termUnified = applySubst(subst, term)
    #     termExpanded = ReprUtils.replaceNthNT(termUnified, ntId, unk)

    termNew = ReprUtils.replaceNthNT(term, ntId, unk)
    return termNew
예제 #3
0
def expandDimConst(term: PPTerm, ntId: int) -> Optional[PPTerm]:
    """
    Expand dimension constant to integer constants (Required for fold zeros)
    """
    nt = ASTUtils.getNthNT(term, ntId)
    if type(nt.sort) != PPDimConst:
        return None

    subTerm = PPIntConst(nt.sort.value)
    termExpanded = ReprUtils.replaceNthNT(term, ntId, subTerm)
    return termExpanded
예제 #4
0
def applyExpandEnum(lib: FnLibrary, term: PPTerm, ntId: int) -> List[PPTerm]:
    res = []

    nt = ASTUtils.getNthNT(term, ntId)
    if type(nt.sort) != PPEnumSort:
        return res

    for i in range(nt.sort.start, nt.sort.end + 1):
        subTerm = PPIntConst(i)
        nxtTerm = expandEnum(term, ntId, subTerm)
        if nxtTerm is not None:
            res.append(nxtTerm)

    return res
예제 #5
0
def expandToVar(lib: FnLibrary, term: PPTerm, ntId: int,
                vname: str) -> Optional[PPTerm]:
    """
    Generate a new term by replacing a "ntId"th NT from a "term" with a variable (in scope) with name "fname"
    """
    nt = ASTUtils.getNthNT(term, ntId)
    # libItem = ScopeUtils.getAVarInScope(lib, term, ntId, vname)
    libItem = lib.getWithLibPrefix(vname)
    assert libItem

    libItem = alphaConvertLibItem(libItem, term)
    subst = unifyOne(libItem.sort, nt.sort)

    if not gUseTypes:
        if subst is None:
            subst = []

    termExpanded = None
    if subst is not None:
        termUnified = applySubst(subst, term)
        termExpanded = ReprUtils.replaceNthNT(termUnified, ntId,
                                              PPVar(libItem.name))

    return termExpanded
예제 #6
0
def expandEnum(term: PPTerm, ntId: int, subTerm: PPTerm) -> Optional[PPTerm]:
    nt = ASTUtils.getNthNT(term, ntId)
    termExpanded = ReprUtils.replaceNthNT(term, ntId, subTerm)
    return termExpanded