Inhalt

Aktueller Ordner: /

unitprimaten.pas

unit Unitprimaten;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

(******************************************************************)
(* Paul Koop M.A. Primaten                           *)
(* Die Simulation wurde ursprunglich entwickelt,                  *)
(* um die Verwendbarkeit von Zellularautomaten                     *)
(* fuer die Algorithmisch Rekursive Sequanzanalyse                *)
(* zu ueberpruefen								*)
(* Modellcharakter hat allein der Quelltext. Eine Compilierung    *)
(* dient nur als Falsifikationsversuch                            *)
(******************************************************************)

(*------------------------------------ Datenstruktur -----------------*)

TYPE
  primat = RECORD
           status,           (* 0,1,2 leer, jungtier, erfahrenes tier   *)
           alter,            (* 0...9 *)
           geschlecht,       (* 0 1 w 2 m *)
           kultur,           (* 0..9 *)
           macht       :0..9;(* 0..9 *)
          END;

 raum = array[1..80,1..24] of primat;
 zahl = ^inhalt;
 inhalt = RECORD
           i:integer;
           v:zahl;
           n:zahl;
          END;
VAR
 a,b:raum;
 n,x,y,xa,ya:zahl;


PROCEDURE aufbau;
PROCEDURE abbaux(x:zahl);
PROCEDURE abbauy(y:zahl);
FUNCTION neu (VAR r:raum; VAR x,y:zahl):primat;
PROCEDURE zufall(VAR von:raum);


implementation


USES dos,crt;



(*---------------------------------------- Prozeduren ---------------*)
PROCEDURE aufbau;
 VAR z:integer;
 BEGIN
  z := 1;
  new(n);
  xa := n;
  x := n;
  x^.i := z;
  REPEAT
   z := z +1;
   new(n);
   x^.n := n;
   n^.v := x;
   x := n;
   x^.i := z;
  UNTIL z = 80;
  x^.n := xa;
  xa^.v := x;

  z := 1;
  new(n);
  ya := n;
  y := n;
  y^.i := z;
  REPEAT
   z := z +1;
   new(n);
   y^.n := n;
   n^.v := y;
   y := n;
   y^.i := z;
  UNTIL z = 24;
  y^.n := ya;
  ya^.v := y;
 END;

PROCEDURE abbaux(x:zahl);
 BEGIN
  IF x^.n <> xa THEN abbaux(x^.n);
  dispose(x);
 END;

PROCEDURE abbauy(y:zahl);
 BEGIN
  IF y^.n <> ya THEN abbauy(y^.n);
  dispose(y);
 END;
FUNCTION neu (VAR r:raum; VAR x,y:zahl):primat;
VAR z:integer;
  FUNCTION umgebungleer (VAR r:raum; VAR x,y:zahl):boolean;
   VAR z:integer;
  BEGIN
   z := 0;
  IF r(.x^.v^.i,y^.v^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.i   ,y^.v^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.n^.i,y^.v^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.v^.i,y^.i   .).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.n^.i,y^.i   .).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.v^.i,y^.n^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.i   ,y^.n^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF r(.x^.n^.i,y^.n^.i.).kultur <>r(.x^.i,y^.i.).kultur THEN z := z +1;
  IF z=8
   THEN umgebungleer:= true
    ELSE umgebungleer:= false;
  END;

  FUNCTION umgebungmaennlichererwachsener (VAR r:raum; VAR x,y:zahl):boolean;
   VAR z:integer;
  BEGIN
   z := 0;
  IF (r(.x^.v^.i,y^.v^.i.).status =2) and (r(.x^.v^.i,y^.v^.i.).geschlecht =2) and (r(.x^.v^.i,y^.v^.i.).kultur<> r(.x^.i,y^.i.).kultur) THEN z := z +1;
  IF (r(.x^.i   ,y^.v^.i.).status =2) and (r(.x^.i   ,y^.v^.i.).geschlecht =2) and (r(.x^.i   ,y^.v^.i.).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.n^.i,y^.v^.i.).status =2) and (r(.x^.n^.i,y^.v^.i.).geschlecht =2) and (r(.x^.n^.i,y^.v^.i.).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.v^.i,y^.i   .).status =2) and (r(.x^.v^.i,y^.i   .).geschlecht =2) and (r(.x^.v^.i,y^.i   .).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.n^.i,y^.i   .).status =2) and (r(.x^.n^.i,y^.i   .).geschlecht =2) and (r(.x^.n^.i,y^.i   .).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.v^.i,y^.n^.i.).status =2) and (r(.x^.v^.i,y^.n^.i.).geschlecht =2) and (r(.x^.v^.i,y^.n^.i.).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.i   ,y^.n^.i.).status =2) and (r(.x^.i   ,y^.n^.i.).geschlecht =2) and (r(.x^.i   ,y^.n^.i.).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF (r(.x^.n^.i,y^.n^.i.).status =2) and (r(.x^.i   ,y^.n^.i.).geschlecht =2) and (r(.x^.i   ,y^.n^.i.).kultur<> r(.x^.i,y^.i.).kultur)  THEN z := z +1;
  IF z=0
   THEN Umgebungmaennlichererwachsener:= false
    ELSE Umgebungmaennlichererwachsener:= true;
  END;

  PROCEDURE kind (VAR r:raum; VAR x,y:zahl);
  TYPE
  elter= RECORD
          m,w: boolean;
          macht:0..9;
         END;

  VAR
  i,ym,k:integer;
  eltern: array(.1..9.) of elter;


  BEGIN

  FOR i:=1 TO 9 DO BEGIN eltern[i].w:=false; eltern[i].m:=false;eltern[i].macht:=0; END;

  IF (r(.x^.v^.i,y^.v^.i.).status =2) THEN BEGIN IF r(.x^.v^.i,y^.v^.i.).geschlecht= 1 THEN eltern[r(.x^.v^.i,y^.v^.i.).kultur].w:=true ELSE IF r(.x^.v^.i,y^.v^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.v^.i,y^.v^.i.).kultur].m:=true; IF r(.x^.v^.i,y^.v^.i.).macht>  eltern[r(.x^.v^.i,y^.v^.i.).kultur].macht THEN eltern[r(.x^.v^.i,y^.v^.i.).kultur].macht:=r(.x^.v^.i,y^.v^.i.).macht END; END;
  IF (r(.x^.i   ,y^.v^.i.).status =2) THEN BEGIN IF r(.x^.i   ,y^.v^.i.).geschlecht= 1 THEN eltern[r(.x^.i   ,y^.v^.i.).kultur].w:=true ELSE IF r(.x^.i   ,y^.v^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.i   ,y^.v^.i.).kultur].m:=true; IF r(.x^.i   ,y^.v^.i.).macht>  eltern[r(.x^.i   ,y^.v^.i.).kultur].macht THEN eltern[r(.x^.i   ,y^.v^.i.).kultur].macht:=r(.x^.i   ,y^.v^.i.).macht END; END;
  IF (r(.x^.n^.i,y^.v^.i.).status =2) THEN BEGIN IF r(.x^.n^.i,y^.v^.i.).geschlecht= 1 THEN eltern[r(.x^.n^.i,y^.v^.i.).kultur].w:=true ELSE IF r(.x^.n^.i,y^.v^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.n^.i,y^.v^.i.).kultur].m:=true; IF r(.x^.n^.i,y^.v^.i.).macht>  eltern[r(.x^.n^.i,y^.v^.i.).kultur].macht THEN eltern[r(.x^.n^.i,y^.v^.i.).kultur].macht:=r(.x^.n^.i,y^.v^.i.).macht END; END;
  IF (r(.x^.v^.i,y^.i   .).status =2) THEN BEGIN IF r(.x^.v^.i,y^.i   .).geschlecht= 1 THEN eltern[r(.x^.v^.i,y^.i   .).kultur].w:=true ELSE IF r(.x^.v^.i,y^.i   .).geschlecht= 2 THEN BEGIN eltern[r(.x^.v^.i,y^.i   .).kultur].m:=true; IF r(.x^.v^.i,y^.i   .).macht>  eltern[r(.x^.v^.i,y^.i   .).kultur].macht THEN eltern[r(.x^.v^.i,y^.i   .).kultur].macht:=r(.x^.v^.i,y^.i   .).macht END; END;
  IF (r(.x^.n^.i,y^.i   .).status =2) THEN BEGIN IF r(.x^.n^.i,y^.i   .).geschlecht= 1 THEN eltern[r(.x^.n^.i,y^.i   .).kultur].w:=true ELSE IF r(.x^.n^.i,y^.i   .).geschlecht= 2 THEN BEGIN eltern[r(.x^.n^.i,y^.i   .).kultur].m:=true; IF r(.x^.n^.i,y^.i   .).macht>  eltern[r(.x^.n^.i,y^.i   .).kultur].macht THEN eltern[r(.x^.n^.i,y^.i   .).kultur].macht:=r(.x^.n^.i,y^.i   .).macht END; END;
  IF (r(.x^.v^.i,y^.n^.i.).status =2) THEN BEGIN IF r(.x^.v^.i,y^.n^.i.).geschlecht= 1 THEN eltern[r(.x^.v^.i,y^.n^.i.).kultur].w:=true ELSE IF r(.x^.v^.i,y^.n^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.v^.i,y^.n^.i.).kultur].m:=true; IF r(.x^.v^.i,y^.n^.i.).macht>  eltern[r(.x^.v^.i,y^.n^.i.).kultur].macht THEN eltern[r(.x^.v^.i,y^.n^.i.).kultur].macht:=r(.x^.v^.i,y^.n^.i.).macht END; END;
  IF (r(.x^.i   ,y^.n^.i.).status =2) THEN BEGIN IF r(.x^.i   ,y^.n^.i.).geschlecht= 1 THEN eltern[r(.x^.i   ,y^.n^.i.).kultur].w:=true ELSE IF r(.x^.i   ,y^.n^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.i   ,y^.n^.i.).kultur].m:=true; IF r(.x^.i   ,y^.n^.i.).macht>  eltern[r(.x^.i   ,y^.n^.i.).kultur].macht THEN eltern[r(.x^.i   ,y^.n^.i.).kultur].macht:=r(.x^.i   ,y^.n^.i.).macht END; END;
  IF (r(.x^.n^.i,y^.n^.i.).status =2) THEN BEGIN IF r(.x^.n^.i,y^.n^.i.).geschlecht= 1 THEN eltern[r(.x^.n^.i,y^.n^.i.).kultur].w:=true ELSE IF r(.x^.n^.i,y^.n^.i.).geschlecht= 2 THEN BEGIN eltern[r(.x^.n^.i,y^.n^.i.).kultur].m:=true; IF r(.x^.n^.i,y^.n^.i.).macht>  eltern[r(.x^.n^.i,y^.n^.i.).kultur].macht THEN eltern[r(.x^.n^.i,y^.n^.i.).kultur].macht:=r(.x^.n^.i,y^.n^.i.).macht END; END;
  ym:=0;k:=0;
  FOR i:=1 TO 9 DO
   BEGIN
   IF (eltern[i].w=true and  eltern[i].m=true)
    THEN
     BEGIN
      IF eltern[i].macht >ym THEN BEGIN ym:=eltern[i].macht;k:=i END
     END
   END;
   IF ((ym>0)and(k>0)) THEN
   BEGIN
   neu.Status:= 1;
   neu.alter:=0;
   neu.macht:=ym;
   neu.geschlecht:=random(2)+1;
   neu.kultur:=k;
   END
  ELSE
  neu:=r(.x^.i,y^.i.);

  END;

  FUNCTION kulturstaerkstesmaennchenannehmen (VAR r:raum; VAR x,y:zahl):integer;
   VAR z:integer;
  BEGIN
   z := 0;
  IF (r(.x^.v^.i,y^.v^.i.).status =2) and (r(.x^.v^.i,y^.v^.i.).macht>z) and (r(.x^.v^.i,y^.v^.i.).geschlecht=2) THEN z := r(.x^.v^.i,y^.v^.i.).kultur;
  IF (r(.x^.i   ,y^.v^.i.).status =2) and (r(.x^.i   ,y^.v^.i.).macht>z) and (r(.x^.i   ,y^.v^.i.).geschlecht=2) THEN z := r(.x^.i   ,y^.v^.i.).kultur;
  IF (r(.x^.n^.i,y^.v^.i.).status =2) and (r(.x^.n^.i,y^.v^.i.).macht>z) and (r(.x^.n^.i,y^.v^.i.).geschlecht=2) THEN z := r(.x^.n^.i,y^.v^.i.).kultur;
  IF (r(.x^.v^.i,y^.i   .).status =2) and (r(.x^.v^.i,y^.i   .).macht>z) and (r(.x^.v^.i,y^.i   .).geschlecht=2) THEN z := r(.x^.v^.i,y^.i   .).kultur;
  IF (r(.x^.n^.i,y^.i   .).status =2) and (r(.x^.n^.i,y^.i   .).macht>z) and (r(.x^.n^.i,y^.i   .).geschlecht=2) THEN z := r(.x^.n^.i,y^.i   .).kultur;
  IF (r(.x^.v^.i,y^.n^.i.).status =2) and (r(.x^.v^.i,y^.n^.i.).macht>z) and (r(.x^.v^.i,y^.n^.i.).geschlecht=2) THEN z := r(.x^.v^.i,y^.n^.i.).kultur;
  IF (r(.x^.i   ,y^.n^.i.).status =2) and (r(.x^.i   ,y^.n^.i.).macht>z) and (r(.x^.i   ,y^.n^.i.).geschlecht=2) THEN z := r(.x^.i   ,y^.n^.i.).kultur;
  IF (r(.x^.n^.i,y^.n^.i.).status =2) and (r(.x^.n^.i,y^.n^.i.).macht>z) and (r(.x^.n^.i,y^.n^.i.).geschlecht=2) THEN z := r(.x^.n^.i,y^.n^.i.).kultur;
  IF z=0
   THEN kulturstaerkstesmaennchenannehmen:= 0
    ELSE kulturstaerkstesmaennchenannehmen:= z;
  END;

  FUNCTION staerkeresmaennchen (VAR r:raum; VAR x,y:zahl):boolean;
   VAR i,z:integer;
  BEGIN
   i:=0;z := r(.x^.i,y^.i.).macht;
  IF (r(.x^.v^.i,y^.v^.i.).status =2) and (r(.x^.v^.i,y^.v^.i.).macht>z) and (r(.x^.v^.i,y^.v^.i.).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.i   ,y^.v^.i.).status =2) and (r(.x^.i   ,y^.v^.i.).macht>z) and (r(.x^.i   ,y^.v^.i.).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.n^.i,y^.v^.i.).status =2) and (r(.x^.n^.i,y^.v^.i.).macht>z) and (r(.x^.n^.i,y^.v^.i.).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.v^.i,y^.i   .).status =2) and (r(.x^.v^.i,y^.i   .).macht>z) and (r(.x^.v^.i,y^.i   .).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.n^.i,y^.i   .).status =2) and (r(.x^.n^.i,y^.i   .).macht>z) and (r(.x^.n^.i,y^.i   .).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.v^.i,y^.n^.i.).status =2) and (r(.x^.v^.i,y^.n^.i.).macht>z) and (r(.x^.v^.i,y^.n^.i.).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.i   ,y^.n^.i.).status =2) and (r(.x^.i   ,y^.n^.i.).macht>z) and (r(.x^.i   ,y^.n^.i.).geschlecht=2) THEN i:=i+1;
  IF (r(.x^.n^.i,y^.n^.i.).status =2) and (r(.x^.n^.i,y^.n^.i.).macht>z) and (r(.x^.n^.i,y^.n^.i.).geschlecht=2) THEN i:=i+1;
  IF I=0
   THEN  staerkeresmaennchen:= false
    ELSE staerkeresmaennchen:= true;
  END;

 BEGIN
   r(.x^.i,y^.i.).alter:=r(.x^.i,y^.i.).alter+1;
   neu:=r(.x^.i,y^.i.);

    IF r(.x^.i,y^.i.).status = 0 (* status leeres feld*)
     THEN
      BEGIN
        kind (r,x,y);
      END
     ELSE
     BEGIN
      IF umgebungleer(r,x,y) or (neu.alter>8)  (* vereinzeltes individuum umgebung leer vereinsamt oder hoechtlebensalter errecht *)
       THEN
        BEGIN
          neu.status:=0;
          neu.alter:=0;
          neu.geschlecht:=0;
          neu.kultur:=0;
          neu.macht:=0;
        END
       ELSE
       BEGIN
        IF r(.x^.i,y^.i.).status = 1 (* jungtier weiblich männlich*)
         THEN
          BEGIN
           (* wenn umgebung männlicher silberrücken anderer kultur dann status auf leer*)
           IF umgebungmaennlichererwachsener(r,x,y)
            THEN
             BEGIN
              neu.status:=0;
              neu.alter:=0;
              neu.geschlecht:=0;
              neu.kultur:=0;
              neu.macht:=0;
             END
         ELSE
          BEGIN                      (* erfahrene Tiere *)
           (* wenn weiblich dann Kultur des silberrücken annehmen*)
            IF (r(.x^.i,y^.i.).geschlecht=1)
             THEN
              BEGIN
               neu.status:=2;
               neu.geschlecht:=1;
               neu.kultur:=kulturstaerkstesmaennchenannehmen (r,x,y);
               neu.macht:=r(.x^.i,y^.i.).macht;
               IF neu.kultur=0
                 THEN
                  BEGIN
                   neu.status:=0;
                   neu.alter:=0;
                   neu.geschlecht:=0;
                   neu.kultur:=0;
                   neu.macht:=0;
                  END
              END;

           (* wenn männliches tier *)
           IF (r(.x^.i,y^.i.).geschlecht=2)
              (* und stärkere männchen  dann leer*)
              THEN
               BEGIN
                IF (staerkeresmaennchen (r,x,y))
                 THEN
                  BEGIN
                   neu.status:=0;
                   neu.alter:=0;
                   neu.geschlecht:=0;
                   neu.kultur:=0;
                   neu.macht:=0;
                  END
                  (* sonst randomisiere macht machtkampf*)
                  ELSE
                  BEGIN
                   neu.status:=2;
                   neu.geschlecht:=2;
                   neu.kultur:=r(.x^.i,y^.i.).kultur;
                   z:=random(15);
                   IF z>9 THen z:=0; neu.macht:=z;
                  END;
                  IF neu.macht=0
                   THEN
                    BEGIN
                    neu.status:=0;
                    neu.alter:=0;
                    neu.geschlecht:=0;
                    neu.kultur:=0;
                    neu.macht:=0;
                  END
                 END
          END
        END
      END
   END
 END;


PROCEDURE zufall(VAR von:raum);
 VAR x,y,z:integer;
 BEGIN
   FOR y := 1 TO 24
   DO
   FOR x := 1 TO 80
    DO
     BEGIN
      von(.x,y.).status:=random(3);
      IF von(.x,y.).status=0
      THEN
      BEGIN
       von(.x,y.).geschlecht:=0;
       von(.x,y.).macht:=0;
       von(.x,y.).kultur:=0;
      END
      ELSE
      BEGIN
       von(.x,y.).geschlecht:=random(2)+1;
       von(.x,y.).macht:=random(9)+1;
       von(.x,y.).kultur:=random(9)+1;
      END;
     END;
 END;









end.