@The_guy
I am pretty sure that Jwitti is wrong. To do what you describe exactly as you describe it would require SDK work, although there are alternatives that are easy and probably just as good. Buildings can easily provide free specialists slots, but not base them on the number of specialists slots you already have. Buildings can also increase the yields or commerces of specialists, but it the effect would be empire wide and would not effect the great person points given by each specialist.
It is easy for one building to change the happiness granted by another, but not the culture. It would be simple to trigger an event that would increase the yield or commerce of the building (or use python to grant the same effect without needing a new event), but I don't know of a way for one building to change the percent culture bonus of another.
@Sam Ro
It should be just as easy to remove techs as to give them using this CyTeam python function, probably placing it in CvEventManager.py or RandomEventInterface.py:
eTeam.setHasTech (gc.getInfoTypeForString('TECH_SOMETHING'), False, -1, False, False)
The first argument is the index of the tech, the second is whether it would be known or not, the fourth is whether the team was the first to discover the tech, and the fifth is whether to announce the acquisition of the tech. I don't think that the third argument would really matter when removing a tech, but when adding one it would be the index of the team whose research led the team in question to having the tech. If it does not refer to the same team as is being given knowledge of the tech, then it is treated as a tech gained in trade and this cannot be traded with the No tech Brokering game option active.
Note that techs are known by the team, not the individual civilization or player. To get eTeam, take the player index (iPlayer) and do this:
pPlayer = gc.getPlayer(iPlayer)
iTeam = pPlayer.getTeam()
eTeam = gc.getTeam(iTeam)