D=[
[(1, 5, 9, 13),
(2, 6, 10, 14),
(3, 7, 11, 15),
(4, 8, 12, 16)],

[(1, 6, 11, 16),
(2, 5, 12, 15),
(3, 8, 9, 14),
(4, 7, 10, 13)],

[(1, 7, 12, 14),
(2, 8, 11, 13),
(3, 5, 10, 16),
(4, 6, 9, 15)],

[(1, 8, 10, 15),
(2, 7, 9, 16),
(3, 6, 12, 13),
(4, 5, 11, 14)],

[(1, 2, 3, 4),
(5, 6, 7, 8),
(9, 10, 11, 12),
(13, 14, 15, 16)]
]

def check_steiner(D):
        print 'Checking steiner'
        for d in D:
                for v in d:
                        for dd in D:
                                if dd == d:
                                        continue
                                for w in dd:
                                        if check_for_pairs_in_common_between_vw(v,w):
                                                print 'S ERRORE: ', v,w
                                                return 0
        return 1

def check_parallelism(D):
        print 'Checking parallelism'
        for d in D:
                for v in d:
                        for w in d:
                                if v == w:
                                        continue
                                if not check_for_parallelism_between_vw(v,w):
                                        print 'P ERRORE', d

def check_for_pairs_in_common_between_vw(v,w):
        for vi in v:
                for vj in v:
                        if vj == vi:
                                continue
                        
                        if vi in w and vj in w:
                                return 1
        return 0
def check_for_parallelism_between_vw(v,w):
        for vi in v:
                if vi in w:
                        return 0
        return 1

def pretty_print(D):
        for d in D:
                s=''
                for v in d:
                        for vi in v:
                                s+='%2d '%(vi,)
                        s+='\n'
                s+='\n\n'
                print s

pretty_print(D)
check_steiner(D)
check_parallelism(D)
