|Representing Anthropological Knowledge: Calculating Kinship|
|Michael D. Fischer||
Analyzing and Understanding Cultural Codes
In Using data entered in the Kinship Editor we translated the output of the Kinship Editor into a prolog program.
Our main reason for representing kinship information in Prolog is to extend our ability to examine and analyze the kinship relationships between people. Diagrams can help to some extent, but once the number of people involved gets as high as twenty or more, the complexity of the possible interconnections grows rapidly. In a group of 20 people there are a minimum of 380 genealogical relationships (each person has 19 relationships). If the group has endogamous mating (within the group of relatives), this number can multiply rapidly, since there may be two or more relationships with each person. Similarly, 200 people have a minimum of 39,800 relationships between them.
Once we have our data represented in prolog, and define a few structural rules, we can choose any two individuals and find out what relationships they share, find all the relatives for one or more people, or if we have a great deal of time, list out all the possible relationships. We can also have conversions from genealogical relationships to the terminological categories used by the people whose kin are represented.
You will find a very basic introduction to prolog in Prolog Reference. We will only touch the surface of prolog, but once you look past the parenthesis and clutter, prolog is a fairly simple computer programming language that is ideally suited for many purposes in anthropology because of its facilities for working with symbolic data and structure. It also uses an approach that is quite different from most programming languages.
The majority of programming languages use a procedural approach, where you must describe the process by which a particular end result comes into being. Prolog uses a declarative paradigm, where you describe the structure of the results you want, and prolog attempts to satisfy this result. In order for prolog to do this you must specify the structural relationships between the different elements you are working with.
For example, the prolog representation of our Kinship Editor output modelled information about people in the form:
where george is a male, 1 is a unique id for the sibset that george belongs to, and 3 is the unique id for the only spouseset that george belongs to. There can be more than one spouseset. For example,
Noddie has two spousesets, but no sibset. Of course in 'real life' Noddie has parents, but a property of collecting data for real genealogies is that these have a horizon - there is a point where the information stops. So as far as our representation is concerned she has no sibset because the information was not collected.
So the general way information is represented in Prolog is the predicate, which associates references enclosed by parenthesis, e.g.
The first case is simply the assertion of a property or global state. It says nothing about relationships. It is read as 'predicate is true'. The second case asserts a property on an element. This is commonly read as 'element is predicate', e.g. george is male. The third case asserts a relationship between two elements. It is often read as 'element1 predicate to/of/is element2',e.g. noddie spouseset is 12 or george sibset is 1.
These readings are conventional, not struck in stone. That is, they are assignments by us to the represented relationships. All that is important is that you keep the same reading throughout your program. The critical things is that a property or relationship is asserted globally, to an individual or between individuals. These are primitive logical concepts.
Next section: Prolog Rules