def cladistic(tree, taxa):
    """Determines the cladistic property of the given taxon set.

    Parameters
    ----------
    tree : skbio.TreeNode
        tree for taxa comparison
    taxa : iterable of str
        taxon names

    Returns
    -------
    str
        'uni' if input taxon is a single tip in given tree
        'mono' if input taxa are monophyletic in given tree
        'poly' if input taxa are polyphyletic in given tree

    Notes
    -----
    In the following tree example:
                                  /-a
                        /--------|
                       |          \-b
              /--------|
             |         |          /-c
             |         |         |
             |          \--------|--d
    ---------|                   |
             |                    \-e
             |
             |                    /-f
             |          /--------|
              \--------|          \-g
                       |
                        \-h
    ['a'] returns 'uni'
    ['c', 'd', 'e'] returns 'mono'
    ['a', 'c', 'f'] returns 'poly'
    ['f', 'h'] returns 'poly'
    Paraphyly, which is programmably indistinguishable from polyphyly, returns
    poly here.

    Raises
    ------
    ValueError
        if one or more taxon names are not present in the tree

    Examples
    --------
    >>> from skbio import TreeNode
    >>> tree = TreeNode.read(['((a,b)c,d)e;'])
    >>> print(cladistic(tree, ['a']))
    uni
    >>> print(cladistic(tree, ['a', 'b']))
    mono
    >>> print(cladistic(tree, ['a', 'd']))
    poly
    """
    tips = []
    taxa = set(taxa)
    for tip in tree.tips():
        if tip.name in taxa:
            tips.append(tip)
    n = len(taxa)
    if len(tips) < n:
        raise ValueError('Taxa not found in the tree.')
    return ('uni' if n == 1 else
            ('mono' if len(tree.lca(tips).subset()) == n else
             'poly'))