An approach you should consider, which is a W3C standard by the way, and I believe has good tool support, is using OWL itself - or rather its standard inferences. Note, however, that this is somewhat limited in expressivity in comparison with languages which let you express custom inference rules (e.g. RIF) already mentioned.
The owl:equivalentClass predicate prescribe the following inference:
If A owl:equivalentClass B, then
A rdfs:subClassOf B and
B rdfs:subClassOf A
which, in turn, means that
for all ?x rdf:type A => ?x rdf:type B and
for all ?y rdf:type B => ?y rdf:type A
This effectivelly maps between two classes. When those classes each come from a different model, you are in effect issuing a mapping between those models when asserting the class equivalence.
Another useful pattern in this case is the Relationship Transfer Pattern, e.g.:
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
ex:RedThing rdfs:subClassOf owl:Thing
ex:RedThing owl:equivalentClass [ a owl:Restriction;
owl:onProperty ex:hasColor;
owl:hasValue "red"@en . ] .
This means that, for any resource ?x for which you define the triple
?x ex:hasColor "red"@en
the triple will be inferred:
?x a ex:RedThing
The usage of OWL for class equivalence and the Relationship Transfer Pattern is well explained in Hendler and Allemang's Semantic Web for the Working Ontlogist, which I'd recommend reading.
Back to your example model. If you already have an owl:Class defined for people, you could just assert:
ex:Person owl:equivalentClass foaf:Person
If you do have an owl:Class, but it's more specific than the meaning of foaf:Person (say ex:Employee), you can just do:
ex:Employeee rdfs:subClassOf foaf:Person
Now suppose you don't have an owl:Class defined for people (pretty bad modeling practice), but instead have it defined by a property, e.g.:
ex:joe a ex:Record ;
ex:relationshipWithFirm "Employee"@en ;
ex:hasEmail <mailto:joe@example.com> .
and want to infer proper foaf triples from that, you could do:
ex:Employee a owl:Class;
rdfs:subClassOf foaf:Person;
owl:equivalentClass [ a owl:Restriction;
owl:onProperty ex:relationshipWithFirm;
owl:hasValue "Employee"@en ] .
ex:hasEmail owl:equivalentProperty foaf:mbox .
That way, for every triple ?x ex:relationshipWithFirm "Employee"@en exists in your source model, ?x will inferred to be a ex:Employee and also a foaf:Person. Additionally, since we have also asserted equivalence between the properties ex:hasEmail and foaf:mbox, that property of foaf has also been inferred for that resource.
Edited: I suggest you see also this answer and the UMBEL project for more info on mapping ontologies.