ChapterPDF Available

Ansätze zu einem Lokalitätsmaß für Rechnerprogramme

Authors:
  • AIS San Marino

Abstract

Approaches for measuring computer program locality Just like other products of human creativity, computer programs may be subject to a formal evaluation by several criteria. Fully formalized criteria allow building automatic evaluators that can give program authors feedback for improving product quality. Such feedback shortens the feedback cycle by which program quality influences the program structure. One such criterion is program "locality", defined as the degree of independence of smaller program parts. The paper discusses rationales why locality is desirable. Automatic calculation of locality requires a quantitative definition that is not based on the program functionality. The paper formulates several requirements to such a definition and proposes to measure the complement of locality, which is easier to handle. Roughly spoken, the definition measures the number and distance of possible interrelationships within a program. Normally un-locality grows when moving to larger program units; the rate of this growth can be interpreted as the growth dimension of un-locality.
Europäische Kommunikationskybernetik heute und morgen
Herausgeber:
Günter Lobin
Heinz Lohse
Siegfried Piotrowski
Eva Poláková
1998
Praha: KAVA-PECH, ISBN 80-85853-38-8
München: KoPäd, ISBN 3-929061-83-5
Der nachstehende Artikel wurde 2015 anhand der Druckausgabe von 1998 nachgesetzt.
1. Modellierung mentaler Prozesse 19
Ansätze zu einem Lokalitätsmaß für Rechnerprogramme
Reinhard Fößmeier
1. Einleitung
Trotz aller Fortschritte in der modernen Programmiertechnik stellen immer noch
die Programme die Schwachstellen in Rechnersystemen dar. Manche Autoren
(z. B. Baber 1982, 1997, 1995} vertreten gar die Ansicht, die Programmierung
würde überwiegend gar nicht im Sinne einer Ingenieursdisziplin gelehrt und
ausgeübt und sie haben zu einem gewissen Grad recht. Die konsequentere
Anwendung formaler und ingenieurmäßiger Methoden bei der Entwicklung von
Programmen ist in der Tat notwendig.
Bei der Betrachtung von Programmen konzentriert man sich jedoch häufig auf
ihre Rolle als Steueranweisungen für Rechner und übersieht dabei, daß sie in
zweifacher Weise mit menschlichen Subjekten verknüpft sind: Mit ihrem Autor,
der sie aus mehr oder weniger informellen Beschreibungen und Aufgaben-
stellungen ableitet, sowie mit künftigen Lesern (einschließlich des Autors), die
sie verstehen oder gar modifizieren wollen. Ihre schöpferische Natur, ihre
Herkunft als Produkte des menschlichen Geistes sowie ihre Bestimmung für
menschliche Leser verleihen ihnen zwangsläufig subjektiven Charakter, der sie
bei formaler Betrachtungsweise eher einer nachträglichen Analyse und Bewer-
tung als einer Erfassung durch ein festes Regelwerk für ihre Erzeugung zu-
gänglich macht.
1Inhaltliche und formale Programmanalyse
Vielfach wird der Ansatz verfolgt, die Übereinstimmung eines Programms mit
einer gegebenen Spezifikation zu überprüfen. Trotz aller Probleme, die damit
verbunden sind, ist dies der einzige statische Weg, Aufschluß über die
Korrektheit eines Programms zu bekommen, also eine Eigenschaft, die sich auf
seine Ausführung im Rechner bezieht. Eigenschaften wie Übersichtlichkeit und
Wartungsfreundlichkeit, die sich auf menschliche Bearbeiter beziehen, sind
solchen Techniken nicht zugänglich. Korrektheitsbeweise sind wie Programme
selbst kreativer Natur; Bauer et al. (1982) sprechen beim Übergang zwischen
Spezifikation und Programm vom „computer-gestützten, intuitionsgeführten
Programmieren“. Wie beim Programmiervorgang selbst muß auch beim Beweis
Geistesarbeit investiert werden, um die Verläßlichkeit eines Programms zu
erhöhen.
Umgekehrt gibt es den Ansatz, Programme nach rein formalen Kriterien zu
beurteilen und damit z.. den Autor mit einer Rückkopplung über sein Produkt
zu versorgen, die er zur Verbesserung von dessen formalen Eigenschaften ver-
wenden kann. Jede Warnung eines Kompilierers ist eine solche Rückkopplung,
20 Ansätze zu einem Lokalitätsmaß für Rechnerprogramme
die dem Programmierer signalisiert, daß er im Begriff ist, eine gefährliche Kon-
struktion zu verwenden. In UNIX-Systemen war früher (vor Einführung der
ANSI-Norm für die Programmiersprache C) das Werkzeug lint ein wichtiges
Hilfsmittel zum Aufdecken formaler Schwächen in der Programmkonstruktion;
lint-bereinigte Programme waren deutlich weniger fehleranfällig und wartungs-
freundlicher.
Erstellung /
Änderung
Programm-
wartung
pragmatische
Bewertung
formale
Bewertung
A
C
inh. Bewertung
(Revision)
B
Bild 1: Rückkopplungsschleifen bei der Programmbewertung
Insbesondere die Qualität der Programme von weniger erfahrenen Program-
mierern kann durch solche Werkzeuge deutlich gesteigert werden.
Bild 1 zeigt die kurze Rückkopplungsschleife A, die dem Programmierer jeder-
zeit erlaubt, die Bewertung seines Produkts in dessen Gestaltung einfließen zu
lassen. Der andere Extremfall ist die lange Rückkopplungsschleife C, bei der
Mängel im Programmaufbau erst bei der Programmwartung, bei einer Fehler-
korrektur oder Funktionserweiterung, festgestellt werden, wenn es im allge-
meinen zu spät ist, die Information in den Programmaufbau einfließen zu lassen.
Zwischen den beiden Fällen liegt die inhaltliche Bewertung durch einen anderen
Programmierer (B).
Formale Programmbewertungen haben gegenüber inhaltlichen den Vorteil, daß
sie automatisch und daher zuverlässig und billig durchführbar sind. Allerdings
setzen sie die Existenz formaler Kriterien voraus.
Ein solches Kriterium ist die funktionale Geschlossenheit und Verständlichkeit
auch kleiner Programmteile, im folgenden als Lokalität bezeichnet. Da der
Mensch mit seinem beschränkten Kurzzeitgedächtnis (vgl. Lehrl, Frank 1982,
Lehrl, Fischer 1988) Schwierigkeiten hat, viele Sachverhalte gleichzeitig zu
berücksichtigen, ist Lokalität günstig für die Verständlichkeit, Wartungsfreund-
lichkeit und Fehlersicherheit von Programmen.
1. Modellierung mentaler Prozesse 21
Die Lokalität ist eine Eigenschaft, die überwiegend dem menschlichen Autor
und Leser dient. Viele lokalitätsbedingte Eigenschaften, wie die Gültigkeitsbe-
reiche von Variablennamen, gehen gar bei der Übersetzung in Maschinensprache
einfach verloren. Die objektorientierte Programmierung hat eine Reihe von
Techniken entwickelt, um Programme mit möglichst wenig nichtlokalen
Abhängigkeiten zu gestalten (vgl. Fößmeier 1994). Ein formales Lokalitätsmaß
für Programmtexte, das automatisch berechnet werden könnte, würde dem
Programmierer Hinweise über die Qualität seines Werkes geben und ihm bei
Änderungen anzeigen, ob sie der Verbesserung dieser Qualität dienen.
const int M = 40;
const int N = 60;
const int NP1 = N+1;
double a[ 40 ][ 61 ];
double a[ M ][ NP1 ];
double y[ 40 ], x[ 60 ]; double y[ M ], x[ N ];
… …
for( i= 0; i < 40; i++ ) { for( i= 0; i < M; i++ ) {
y[ i ] = a[ i ][ 60 ]; y[ i ] = a[ i ][ N ];
for( j= 0; j < 60; j++ )
{
for( j= 0; j < N; j++ ) {
y[i] += a[i][j]*x[j]; y[i] += a[i][j]*x[j];
} }
Bild 2: Symbolische Konstanten erhöhen die Lokalität
char * elemente[] = {
"Wasserstoff",
"Helium",
"Lithium",
};
char * symbole[] = {
"H", "He", "Li"
};
struct {
char * lang,
char * kurz ) elemente[] =
{
"Wasserstoff", "H",
"Helium", "He",
"Lithium", "Li",
};
Bild 3: Notationelle Nähe von Zusammengehörigem erleichtert die Übersicht
3. Entwurf eines Lokalitätsmaßes
Erfahrenen Programmierern ist das Streben nach Lokalität im Programm so
selbstverständlich, daß sie wenig darüber nachdenken. Lokalität bedeutet kleine
Programmblöcke, Aufspaltung in Unterprogramme mit klaren, schmalen
Schnittstellen und Vermeidung globaler Variablen (vgl. Wulf, Shaw 1973).
Weniger klar macht man sich oft, daß auch andere Programmiergrundsätze
letztlich dem Streben nach Lokalität dienen. Dazu gehört die Verwendung
symbolischer Konstanten, deren Namen die inhaltliche Verbindung zwischen
22 Ansätze zu einem Lokalitätsmaß für Rechnerprogramme
den Orten herstellen, an denen eine Konstante verwendet wird. Ein Programm,
das symbolische Konstanten verwendet, hat also höhere Lokalität als ein
Programm mit echten (literalen) Konstanten, zu deren Verständnis der Leser oft
mehrere Programmteile studieren muß. Selbst in dem einfachen Beispiel in Bild 2
muß man links beim Lesen der for-Schleifen (Zeilen 4, 6) zur Vereinbarung der
Matrix a in Zeile 1 zurückblicken, um die Bedeutung der Werte 40 und 60 zu
erschließen; eine Änderung der Werte betrifft eine Reihe von Stellen. Im rechten
Teil erleichtern die symbolischen Konstanten M und N Verständnis und
Modifikation. Auch geeignete Datenstrukturen können die Lokalität der
Aufschreibung verbessern, wie Bild 3 zeigt.
Auf der Modulebene existieren verschiedene Kriterien zur Messung der Kopp-
lung zwischen Modulen, die bei Offut et al. (1993) gut beschrieben sind.
3.1 Grundtzliche Anforderungen
Ein formales Lokalitätsmaß L sollte zumindest folgende Bedingungen erfüllen:
1. Kleinere Geltungsbereiche symbolischer Namen (für Konstanten,
Variablen, Unterprogramme, Klassen, usw.) erhöhen L.
2. Notationelle Nähe zusammenhängender Objekte erhöht L. Diese Nähe
kann sich formal durch Zusammenfassung in Datenstrukturen ausdrücken..
3. Literale Konstanten (im Gegensatz zu symbolischen Konstanten mit „spre-
chenden“ Namen) vermindern L, außer ihre Bedeutung ist offenkundig,
wie häufig bei „0“.
4. Hinzufügen bedeutungsloser Programmteile darf L nicht erhöhen (keine
„Verdünnung“ von Nichtlokalität).
3.2 Beispielhafte Realisierung
Die obigen Grundsätze erfüllt der folgende Vorschlag, der zwar keine Details der
Programmierung berücksichtigt, dafür aber sehr einfach zu realisieren ist:
Gemessen wird zunächst nicht die Lokalität, sondern ihr Inverses,
nachfolgend Nichtlokalität N genannt. Diese läßt sich als additive
Meßgröße definieren, was die Behandlung sehr erleichtert.
Symbolische Konstanten tragen proportional zur Länge ihres Gültigkeits-
bereichs zu N bei. Längen von Programmteilen bemessen sich nach der
Anzahl der vorkommenden Operationen. Zu den Operationen zählt auch
der Aufruf von Unterprogrammen bzw. Methoden.
Variablen tragen proportional zum Quadrat der Länge ihres Gültigkeits-
bereichs zu N bei. Dieser Festlegung liegt der Gedanke zugrunde, daß jede
Programmstelle, die einen Variablenwert ändert, potentiell zu jeder Stelle,
1. Modellierung mentaler Prozesse 23
die den Wert verwendet, eine Abhängigkeit schafft. Da die Möglichkeiten
für beides linear mit der Größe des Gültigkeitsbereichs wachsen, wächst
die Zahl der potentiellen Abhängigkeiten also quadratisch. Aus diesem
Grund sind symbolische Konstanten, aber auch „konstante Variablen“ (die
nach der Initialisierung nicht mehr verändert werden können) wesentlich
harmloser als Variablen (vgl. Fößmeier 1994).
Datenstrukturen zählen dort, wo nicht explizit auf ihre Komponenten zuge-
griffen wird, nur wie gewöhnliche Variablen.
Jede unerklärte explizite (literale) Konstante trägt bei jedem Auftreten pro-
portional zur Länge des Gesamtprogramms zu N bei. Als erklärt gilt eine
Konstante als Definition einer symbolischen Konstante. Dadurch verbes-
sert die Verwendung einer symbolischen Konstante stets die Lokalität.
Eine noch höhere Gewichtung unerklärter Konstanten wäre durchaus zu
rechtfertigen, da der Leser mit inhaltlichen Abhängigkeiten von beliebigen
anderen Konstanten rechnen muß.
Nach dieser Definition ergibt sich für den linken Teil von 2 eine Nichtlokalität
von 468, für den rechten von nur 405. Den Unterschied von 63 bewirken links 7
Konstanten und 9 Operationen.
3.3 Praktischer Einsatz
Für den praktischen Einsatz eines Lokalitätsmaßes ist ein automatisches Meß-
werkzeug in Form eines einfach zu bedienenden Programms unerläßlich. Dieses
Programm sollte gut in die Arbeitsumgebung integriert sein und Auskunft darüber
geben, welche Programmteile wie stark zur Nichtlokalität beitragen. Das kann
zum Beispiel dadurch geschehen, daß beim Anwählen einer Programmgröße ihr
Gültigkeitsbereich farblich hervorgehoben wird. Ein solches Werkzeug existiert
für das vorgeschlagene Maß noch nicht.
3.4 Problemunabhängige Bewertung
Die wie oben definierte Nichtlokalität eignet sich nur zum Vergleich verschie-
dener Lösungen (Implementierungen) desselben Problems; sie liefert keine
absolut aussagekräftigen Bewertungen. Eine solche Bewertung ergibt sich, zu-
mindest für Programme vergleichbarer Größe, wenn die Nichtlokalität durch die
Programmlänge geteilt wird; wir bezeichnen das Ergebnis als längenbereinigte
Nichtlokalität Ñ. Sie mißt im Wesentlichen ein Produkt aus mittlerer Zahl
nebeneinander gültiger Variablen und mittlerer Länge der Gültigkeitsbereiche.
Leider besitzt sie nicht die erwähnte Eigenschaft der Unverdünnbarkeit (4.):
Durch Einfügen bedeutungsloser Programmteile mit wenig Nichtlokalität läßt
sich der Quotient beliebig drücken. Eine solche Maßzahl eignet sich also nicht
24 Ansätze zu einem Lokalitätsmaß für Rechnerprogramme
unbedingt zu einer kritischen Bewertung, kann jedoch einem Programmierer
Hinweise auf seinen Stil geben.
3.5 Messungen auf unterschiedlichen Modulebenen
Mißt man die längenbereinigte Nichtlokalität immer größerer Programme, so
wird man wachsende Werte feststellen. Der Grund sind die Wechselbeziehungen
zwischen den Programmteilen.
Bei gemeinsamer Bewertung zweier völlig unabhängiger Teile ergibt sich ein
Mittel ihrer einzelnen Nichtlokalitäten; bei Abhängigkeiten erhöht sich jedoch die
Nichtlokalität durch die vorhandenen Schnittstellen. Deklarieren etwa zwei
gleich große Teile A und B der Länge l je 3n Variablen, davon 2n lokale und n
nichtlokale (also 2n gemeinsame), so ist die längenbereinigte Nichtlokalität des
Gesamten doppelt so groß wie die der Teile:
Ñ A = Ñ B = 3 n l2 / l = 3 n l
Ñ A+B = ( 2 n l2 + 2 n l2 + 2 n (2 l)2 ) / (2 l) = 6 n l
Wenn sich das auf allen Programmebenen fortsetzt, so ist die Abhängigkeit von
Modulgröße l und Nichtlokalität Ñ gleich Ñ 2l. Dagegen bleibt beim Zusam-
menfügen unabhängiger Programmteile die Nichtlokalität im Mittel konstant.
Bei großen Programmsystemen läßt sich durch Nichtlokalitätsmessungen auf
verschiedenen Ebenen die Größenordnung des Wachstums bestimmen, eine
Kenngröße, die definitionsgemäß nicht von der Größe des betrachteten
Ausschnitts abhängt.
Zeilen Operationen N Ñ
Programm 1 686 605 1.152.878 1.905
Modul 1.1 286 42 % 266 44 % 983.865 85 % 3.698
Modul 1.2 147 21 % 99 16 % 45.383 4 % 458
Modul 1.3 106 15 % 104 17 % 98.470 9 % 946
Modul 1.4 62 9 % 62 10 % 8.219 0 % 132
Modul 1.5 44 7 % 47 8 % 13.997 1 % 297
Modul 1.6 41 6 % 27 5 % 2.944 0 % 109
Programm 2 1.112 669 4.407.511 6.588
Modul 2.1 688 62 % 442 66 % 4.268.304 97 % 9.656
Modul 2.2 145 13 % 54 8 % 13.802 0 % 255
Modul 2.3 119 11 % 82 12 % 95.248 2 % 1.161
Modul 2.4 97 8 % 53 8 % 20.140 1 % 380
Modul 2.5 69 6 % 38 6 % 10.001 0 % 263
Programm 3 621 460 8.021.621 17.438
Bild 4: Lokalitätsmessungen an drei Programmen
1. Modellierung mentaler Prozesse 25
4 Erste praktische Erfahrungen
Erste Versuche wurden mit einem Meßprogramm durchgeführt, das noch nicht
alle Programmdetails berücksichtigte. Mit dem wie oben definierten M
wurden drei kleine Programme (interaktive Spielprogramme, 600 bis 1100 Zeilen
Java) dreier gegenseitig unbekannter Programmierer untersucht. In zwei Fällen
stellte sich heraus, daß es jeweils ein Modul gab, das sowohl von der Textlänge
(42 % bzw. 62 %) als auch von der Nichtlokalität (85 % bzw. 97 %) her über-
wog. Das dritte Programm bestand aus nur einem Modul und wies bei weitem
das höchste Ñ auf. Bild 4 legt den nicht überraschenden Schluß nahe, daß
gleichmäßigere Modularisierung bessere Lokalität ergibt.
Um Aussagen über die Relevanz der Nichtlokalität als Bewertungskriterium
machen zu können, wäre es hilfreich, die Wartungskosten von Programmen mit
ihrem Ñ zu vergleichen. Leider fehlt derzeit noch ein geeignetes Versuchsfeld.
Messungen an vergleichbaren Programmen ein und desselben Autors zeigten
eine Bandbreite von Ñ, die zwar unter den Schwankungen im Bild 4 lag, aber
dennoch ein Verhältnis von ca. 1 : 2 erreichte.
Schrifttum
Baber, R. L: Software reflected. North Holland, 1982. Deutsche Übersetzung:
Softwarereflexionen. Springer-Verlag.
Baber, R. L: The spine of software. Designing provably correct Software. Wiley,
Chichester 1987.
Baber, R. L: Praktische Anwendbarkeit mathematisch rigoroser Methoden zum
Sicherstellen der Programmkorrektheit. Walter de Gruyter, Berlin 1995.
Bauer F. L. et al: The Munich project CIP, vol. I. Lecture Notes in Computer
Science, 183. Springer-Verlag, New York 1982.
Fößmeier, R: Pri kelkaj rilatoj inter la homa menso kaj komputil-programadaj
teknikoj. Grundlagenstudien aus Kybernetik und Geisteswissenschaft,
Band 29, Heft 2, 63–69, Juni 1988.
Fößmeier, R: Konstanter als „const“. Objektspektrum 5/94, 83–84.
Lehrl, S., H. G. Frank: Zur humangenetischen Erklärung der Kurzspeicher-
kapazität. In: Psychogenetics of Intelligence, verlag modernes lernen,
Dortmund 1982, 171–181. Nachdruck aus: grkg/Humankybernetik,
Band 23 (4), 1982, 177–187.
Lehrl, S., B. Fischer: The basic parameters of human information processing:
Their role in the determination of intelligence. Person. individ. Diff., vol.
9, no. 5, 883–896, 1988.
Offut, J., M. J. Harrold, P. Kolte: A software metric system for module coupling.
The Journal of Systems and Software, v. 20 (3), 295–308, 1993.
Wulf, W., M. Shaw: Global variables considered harmful. SIGPLAN Notices,
8(2), 28–34, 1973.
26 Ansätze zu einem Lokalitätsmaß für Rechnerprogramme
Zusammenfassung / Resumo / Summary
Aliroj por mezuri la lokecon de komputilaj programoj.
Simile kiel aliaj kreaj produktoj de la homa menso, komputilaj programoj estas
alireblaj per formala prijuĝo laý diversaj kriterioj. Por plene formaligitaj kriterioj
eblas la konstruado de aŭtomataj mezuriloj, kiuj povas doni al la verkanto retro-
informon por plibonigi la kvaliton de la produkto. Tia retro-informo mallongigas
la ciklon, laý kiu informoj pri la kvalito de la programo re-influas tiun ĉi. Precipe
ne tro spertaj programistoj povas profiti de tia helpilo, kiel pruvas kompareblaj
iloj jam uzataj.
Unu tia kriterio estas la „lokeco“ de programo, difinita kiel la grado de mem-
stareco de malgrandaj partoj de programo. Kialoj por la dezirindeco de lokeco
estas diskutataj.
Por aŭtomata kalkulado de lokeco necesas kvanta difino, kiu ne apogiĝas sur
enhavaj ecoj de la esplorata programo. Kelkaj postuloj al tia difino estas
formulitaj, kaj kiel ebla realigo estas proponata la mezurado de la nelokeco, la
inverso de lokeco, pli facile manipulebla. Ĝi mezuras proksimume la nombron
kaj distancon de eblaj interrilatoj en programo. Normale la nelokeco kreskas dum
transiro al pli grandaj program-unuoj; la rapideco de tiu kreskado difinas
grandecon kompreneblan kiel kresko-dimensio de nelokeco.
Unuaj aplikaj rezultoj estas prezentataj.
ResearchGate has not been able to resolve any citations for this publication.
Article
Low module coupling is considered to be a desirable quality for modular programs to have. Previously, coupling has been defined subjectively and not quantified, making it difficult to use in practice. In this article, we extend previous work to reflect newer programming languages and quantify coupling by developing a general software metric system that allows us to automatically measure coupling. We have precisely defined the levels of coupling so that they can be determined algorithmically, incorporated the notion of direction into the coupling levels, and accounted for different types of nonlocal variables present in modern programming languages. With our system, we can measure the coupling between all pairs of modules in a system, measure the coupling of a particular module with all other modules in a system, and measure the coupling of an entire system. We have implemented our metric system so that it measures the coupling between pairs of procedures in arbitrary C programs and have analyzed several well-used systems of various sizes.
Article
Information psychology deals with information processing in humans which is measured in terms of time units (sec) and information units (bits) and is described by relatively simple models. The model of psychostructure is crucial. It adequately refers to information processing which runs as sequential dichotomous decisions on a ‘yes-no’ or an ‘on-off’ basis. The information unit 1 bit is allocated to each decision.Three basic parameters are important in central information processing: (1) The information flow to the short term storage CK (15.0 ± 3.1 bit/sec in adults). (2) The duration of presence (retention in primary memory) = TR (5.4 ± 0.8 sec in adults). (3) The basic speed of learning CV (depending on the time to retrieval: 0.01 to 1.00 bit/sec in adults). These capacities increase continuously from childhood to adulthood. Within each age group there are remarkable individual differences which exceed variations of biological variables such as body length or brain weight by far.The prerequisite of information psychological measurement is to determine the information content of the stimuli and the reactions and to measure the time between the stimulus and the response. Based on this it is shown that the basic parameters are unspecific, because the type of information, the sensory modalities and the repertory of signs do not alter the results. Besides, the parameters are independent of each other and reach the level of a ratio scale. According to other concepts and other empirical findings, CK and TR determine the intelligence quotient including the vocabulary while CV corresponds to mechanical learning. Tests for these parameters are given.
Deutsche Übersetzung: Softwarereflexionen
  • R Baber
Baber, R. L: Software reflected. North Holland, 1982. Deutsche Übersetzung: Softwarereflexionen. Springer-Verlag.
Pri kelkaj rilatoj inter la homa menso kaj komputil-programadaj teknikoj
  • R Fößmeier
Fößmeier, R: Pri kelkaj rilatoj inter la homa menso kaj komputil-programadaj teknikoj. Grundlagenstudien aus Kybernetik und Geisteswissenschaft, Band 29, Heft 2, 63-69, Juni 1988.
Zur humangenetischen Erklärung der Kurzspeicherkapazität
  • S Lehrl
  • H G Frank
Lehrl, S., H. G. Frank: Zur humangenetischen Erklärung der Kurzspeicherkapazität. In: Psychogenetics of Intelligence, verlag modernes lernen, Dortmund 1982, 171-181. Nachdruck aus: grkg/Humankybernetik, Band 23 (4), 1982, 177-187.