petri net kernel (pnk) wellington joão da silva mestrado ciência computação
TRANSCRIPT
Petri Net Kernel (PNK)
Wellington João da SilvaWellington João da SilvaMestrado Ciência ComputaçãoMestrado Ciência Computação
Introdução
Petri Net Kernel (PNK)Petri Net Kernel (PNK) Infra-estrutura para a construção de ferramentas Infra-estrutura para a construção de ferramentas
baseadas em Redes de Petri (Petri net tools).baseadas em Redes de Petri (Petri net tools). Rede de PetriRede de Petri
Uma rede de Petri é um grafo direcionado, Uma rede de Petri é um grafo direcionado, biparticionado, com nós chamados lugares e biparticionado, com nós chamados lugares e transições. transições.
Características Libera o programador de uma ferramenta baseada em Libera o programador de uma ferramenta baseada em
Redes de Petri da necessidade de implementarRedes de Petri da necessidade de implementar Operações padrão de Redes de Petri,Operações padrão de Redes de Petri, Interfaces de usuário, Interfaces de usuário, Editores gráficos Editores gráficos Parsers para carregar uma rede a partir de um arquivo.Parsers para carregar uma rede a partir de um arquivo.
Programador necessita concentrar-se apenas na Programador necessita concentrar-se apenas na funcionalidade, tal como funcionalidade, tal como Análise, Análise, VerificaçãoVerificação Algoritmos de simulação. Algoritmos de simulação.
Características PNK pode ser usado com qualquer tipo de PNK pode ser usado com qualquer tipo de
rederede Pode ser usado para integrar ferramentas Pode ser usado para integrar ferramentas
baseadas em Redes de Petri existentes ou baseadas em Redes de Petri existentes ou módulos de análisemódulos de análise INA-PilotINA-Pilot
PNK permite a definição de novos tipos de PNK permite a definição de novos tipos de redes de Petriredes de Petri
PNK Software
PNK versão 2.0 é software livrePNK versão 2.0 é software livre Pode ser distribuído e/ou modificado sob a Pode ser distribuído e/ou modificado sob a
licença GNU Library General Public licença GNU Library General Public LicenseLicense
Instalação e execução
Download do arquivo Download do arquivo PNK2alpha.PNK2alpha.jarjar. . Extrair o arquivo na linha de comando Extrair o arquivo na linha de comando digitandodigitando jar xvf PNK2alpha.jarjar xvf PNK2alpha.jar
Iniciar o Petrinet Kernel usando a opcao Iniciar o Petrinet Kernel usando a opcao --jarjar do interpretador Java. do interpretador Java. java -jar PNK2.jarjava -jar PNK2.jar
Abrir, editar e salvar redes
File -> Open
Abrir, editar e salvar redes
Abrir, editar e salvar redes
Iniciar sessão de simulação Escolher Net -> Start Application -> SimulatorEscolher Net -> Start Application -> Simulator Menu do simulador deve aparecer no menu do Menu do simulador deve aparecer no menu do
ApplicationControlApplicationControl Escolher Simulator -> Start para iniciar o simuladorEscolher Simulator -> Start para iniciar o simulador Aparecerá uma janela com um botão CANCELAparecerá uma janela com um botão CANCEL Clicar nas transições habilitadasClicar nas transições habilitadas OBS: não utilizar Simulator -> Stop no menubar do OBS: não utilizar Simulator -> Stop no menubar do
ApplicationControl porque esta operação não esta ApplicationControl porque esta operação não esta corretamente implementadacorretamente implementada
PNK Software PacotesPacotes
de.huberlin.informatik.pnk.kernel de.huberlin.informatik.pnk.kernel de.huberlin.informatik.pnk.kernel.base de.huberlin.informatik.pnk.kernel.base de.huberlin.informatik.pnk.app de.huberlin.informatik.pnk.app de.huberlin.informatik.pnk.app.base de.huberlin.informatik.pnk.app.base de.huberlin.informatik.pnk.appControl de.huberlin.informatik.pnk.appControl de.huberlin.informatik.pnk.appControl.base de.huberlin.informatik.pnk.appControl.base de.huberlin.informatik.pnk.netElementExtensions de.huberlin.informatik.pnk.netElementExtensions de.huberlin.informatik.pnk.netElementExtensions.base de.huberlin.informatik.pnk.netElementExtensions.base de.huberlin.informatik.pnk.editor de.huberlin.informatik.pnk.editor de.huberlin.informatik.pnk.exceptions de.huberlin.informatik.pnk.exceptions
PNK Software Pacotes (características básicas)Pacotes (características básicas)
kernel –kernel – definição de Graph, Net, e elementos associados (Node, definição de Graph, Net, e elementos associados (Node, Arc, etc) Arc, etc)
app –app – suporte ao desenvolvimento de aplicações usando PNK suporte ao desenvolvimento de aplicações usando PNK (MetaApplication)(MetaApplication)
appControl –appControl – I/O, parse de arquivos XML I/O, parse de arquivos XML netElementExtensions –netElementExtensions – definição e implementação de extensões definição e implementação de extensões
para elementos da rede (FiringRule, Inscription, Marking, Mode, para elementos da rede (FiringRule, Inscription, Marking, Mode, etc)etc)
editor –editor – suporte para o desenvolvimento de editores usando PNK suporte para o desenvolvimento de editores usando PNK exceptions –exceptions – exceções definidas no PNK exceções definidas no PNK
Kernel
Net Net Arc Arc Place Place Transition Transition Extension Extension Specification Specification
Net class
Descreve uma rede de PetriDescreve uma rede de Petripublic final class Net extends Graph {public final class Net extends Graph { public Vector getArcs()public Vector getArcs() public Vector getPlaces() public Vector getPlaces() public Vector getTransitions()public Vector getTransitions() public FiringRule getFiringRule() public FiringRule getFiringRule() } // class Net} // class Net
Place class Descreve uma lugar em uma rede de PetriDescreve uma lugar em uma rede de Petripublic final class Place extends Nodepublic final class Place extends Node public Place(Net net, String name, Object public Place(Net net, String name, Object
initiator)initiator) public void delete(Object initiator)public void delete(Object initiator) public Marking getMarking()public Marking getMarking() public void setMarkingAsInitial()public void setMarkingAsInitial()} // class Place} // class Place
Transition Descreve uma transição em uma rede de Descreve uma transição em uma rede de
PetriPetripublic final class Transition extends Node {public final class Transition extends Node {
public Transition(Net net, String public Transition(Net net, String name, Object initiator)name, Object initiator)
public void delete(Object initiator)public void delete(Object initiator) public Mode getMode() public Mode getMode() } // class Transition } // class Transition
Arc class Descreve um arco em uma rede de PetriDescreve um arco em uma rede de Petripublic class Arc extends Edge {public class Arc extends Edge { public Arc(Net net, Node source, Node target, Object initiator)public Arc(Net net, Node source, Node target, Object initiator) public Inscription getInscription()public Inscription getInscription() public Place getPlace()public Place getPlace() public Transition getTransition()public Transition getTransition() /// METHODS INHERITED FROM class Edge: /// METHODS INHERITED FROM class Edge: public Node getSource()public Node getSource() public Node getTarget()public Node getTarget()} // class Arc } // class Arc
ApplicationControl class
Gerencia todas as redes e aplicações do Petri Net Gerencia todas as redes e aplicações do Petri Net Kernel. Kernel.
Faz o parse de alguns arquivos XML para Faz o parse de alguns arquivos XML para configuraçãoconfiguração Especificação de todos os tipos de rede (diretório Especificação de todos os tipos de rede (diretório
netTypeSpecification/netTypeSpecification/)) Lista de aplicações válidas para cada Lista de aplicações válidas para cada
rede(arquivo rede(arquivo toolSpecification.xmltoolSpecification.xml)) Carrega(load) e escreve redes como arquivos PNMLCarrega(load) e escreve redes como arquivos PNML
Net Type Specification<?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?><!DOCTYPE netTypeSpecification SYSTEM <!DOCTYPE netTypeSpecification SYSTEM
"netTypeSpecification.dtd">"netTypeSpecification.dtd"><netTypeSpecification name="graph"><netTypeSpecification name="graph">
<extendable class="de.huberlin.informatik.pnk.kernel.Net"><extendable class="de.huberlin.informatik.pnk.kernel.Net"></extendable></extendable><extendable class="de.huberlin.informatik.pnk.kernel.Place"><extendable class="de.huberlin.informatik.pnk.kernel.Place"></extendable></extendable><extendable class="de.huberlin.informatik.pnk.kernel.PlaceArc"><extendable class="de.huberlin.informatik.pnk.kernel.PlaceArc"></extendable></extendable>
</netTypeSpecification></netTypeSpecification>
Tool Specification Estruturado em três partesEstruturado em três partes
Declaração dos tipos de redesDeclaração dos tipos de redes Lista de aplicações com relação aos tipos Lista de aplicações com relação aos tipos
de redede rede Formato de entrada/saída (PNML no Formato de entrada/saída (PNML no
caso)caso) Para cada aplicação deve-se especificar os Para cada aplicação deve-se especificar os
tipos de rede possíveis.tipos de rede possíveis.
Tool Specification< ?xml version="1.0" encoding="UTF-8"? >< ?xml version="1.0" encoding="UTF-8"? >< !DOCTYPE toolSpecification SYSTEM "toolSpecification.dtd" >< !DOCTYPE toolSpecification SYSTEM "toolSpecification.dtd" >< toolSpecification >< toolSpecification > < !-- Nettypes -- >< !-- Nettypes -- > < nettype id="n1" typeSpecification="file:netTypeSpecifications/simpleHLNet.xml"/ >< nettype id="n1" typeSpecification="file:netTypeSpecifications/simpleHLNet.xml"/ > < nettype id="n2" typeSpecification="file:netTypeSpecifications/dawnNet.xml"/ >< nettype id="n2" typeSpecification="file:netTypeSpecifications/dawnNet.xml"/ > < nettype id="n3" typeSpecification="file:netTypeSpecifications/Echo.xml"/ >< nettype id="n3" typeSpecification="file:netTypeSpecifications/Echo.xml"/ > < !-- Applications -- >< !-- Applications -- > < application id="a1" mainClass="de.huberlin.informatik.pnk.editor.Editor" < application id="a1" mainClass="de.huberlin.informatik.pnk.editor.Editor"
maxinstances="inf" >maxinstances="inf" > < allowedNettypes >< allowedNettypes > < ntref ref="n1"/ >< ntref ref="n1"/ > < ntref ref="n2"/ >< ntref ref="n2"/ > < ntref ref="n3"/ >< ntref ref="n3"/ > < /allowedNettypes >< /allowedNettypes > < /application >< /application >
Tool Specification < !-- Input / Output -- >< !-- Input / Output -- > < format id="pnml" ioClass="de.huberlin.informatik.pnk.appControl.PnmlInOut" >< format id="pnml" ioClass="de.huberlin.informatik.pnk.appControl.PnmlInOut" > < allowedNettypes >< allowedNettypes > < ntref ref="n1"/ >< ntref ref="n1"/ > < ntref ref="n2"/ >< ntref ref="n2"/ > < /allowedNettypes >< /allowedNettypes > < /format >< /format > < format id="io" ioClass="de.huberlin.informatik.pnk.appControl.InOut" >< format id="io" ioClass="de.huberlin.informatik.pnk.appControl.InOut" > < /format >< /format > < !-- default settings -- >< !-- default settings -- > < standardNettype ref="n1"/ >< standardNettype ref="n1"/ > < standardApplication ref="a1"/ >< standardApplication ref="a1"/ > < standardFormat ref="pnml"/ >< standardFormat ref="pnml"/ >< /toolSpecification > < /toolSpecification >
Editor class
Quando uma rede é aberta ela é mostrada Quando uma rede é aberta ela é mostrada por default em um editorpor default em um editor
Para permitir que aplicações trabalhem com Para permitir que aplicações trabalhem com um editor é recomendado a utilização da um editor é recomendado a utilização da interface interface ApplicationNetDialogApplicationNetDialog..
ApplicationNetDialogpackage de.huberlin.informatik.pnk.app.base;package de.huberlin.informatik.pnk.app.base;......// If an application want's to request the editor to emphasize, anotate or select one/some object[s], it has to // If an application want's to request the editor to emphasize, anotate or select one/some object[s], it has to // use the methods of this interface.// use the methods of this interface.public interface ApplicationNetDialog {public interface ApplicationNetDialog { ...... public void anotateObjects(Hashtable anotations);public void anotateObjects(Hashtable anotations); public void emphasizeObjects(Vector objects);public void emphasizeObjects(Vector objects); public Vector selectObjects(Vector objects);public Vector selectObjects(Vector objects); public void unAnotateObjects(Vector objects);public void unAnotateObjects(Vector objects); public void unEmphasizeObjects(Vector objects);public void unEmphasizeObjects(Vector objects); public void setPosition(Object netobject, int pageId, int x, int y);public void setPosition(Object netobject, int pageId, int x, int y);} //interface ApplicationNetDialog} //interface ApplicationNetDialog
Escrevendo Nettypes
PNK permite que novos tipos de rede sejam PNK permite que novos tipos de rede sejam especificadosespecificados
É preciso informar no toolspecificationfile É preciso informar no toolspecificationfile que um novo tipo de rede existe e onde ele que um novo tipo de rede existe e onde ele pode ser encontrado pode ser encontrado
Tool Specification File< !DOCTYPE toolSpecification SYSTEM "toolSpecification.dtd" >< !DOCTYPE toolSpecification SYSTEM "toolSpecification.dtd" >< toolSpecification >< toolSpecification > < !-- Nettypes -- >< !-- Nettypes -- > < nettype id="n1" < nettype id="n1"
typeSpecification="file:netTypeSpecifications/PTNet.xml"/ >typeSpecification="file:netTypeSpecifications/PTNet.xml"/ > < !-- Applications -- >< !-- Applications -- > < !-- Here comes a list of applications ... -- >< !-- Here comes a list of applications ... -- > < !-- Input / Output -- >< !-- Input / Output -- > < !-- Here comes a list of Input / Output filters ... -- >< !-- Here comes a list of Input / Output filters ... -- >< /toolSpecification >< /toolSpecification >
Net Type Specification< ?xml version="1.0" encoding="UTF-8"? >< ?xml version="1.0" encoding="UTF-8"? >< !DOCTYPE netTypeSpecification SYSTEM "netTypeSpecification.dtd" >< !DOCTYPE netTypeSpecification SYSTEM "netTypeSpecification.dtd" >< netTypeSpecification name="PTNet" >< netTypeSpecification name="PTNet" > < extendable class="de.huberlin.informatik.pnk.kernel.Net" >< extendable class="de.huberlin.informatik.pnk.kernel.Net" > < extension name="firingRule" class="de.huberlin.informatik.pnk.netElementExtensions.llNet.SimpleRule"/ >< extension name="firingRule" class="de.huberlin.informatik.pnk.netElementExtensions.llNet.SimpleRule"/ > < /extendable >< /extendable > < extendable class="de.huberlin.informatik.pnk.kernel.Place" >< extendable class="de.huberlin.informatik.pnk.kernel.Place" > < extension name="marking" class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber"/ < extension name="marking" class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber"/
>> < extension name="initialMarking" < extension name="initialMarking"
class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber"/ >class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber"/ > < /extendable >< /extendable > < extendable class="de.huberlin.informatik.pnk.kernel.Transition" >< extendable class="de.huberlin.informatik.pnk.kernel.Transition" > < /extendable >< /extendable > < extendable class="de.huberlin.informatik.pnk.kernel.Arc" >< extendable class="de.huberlin.informatik.pnk.kernel.Arc" > < extension name="inscription" < extension name="inscription"
class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber1"/ >class="de.huberlin.informatik.pnk.netElementExtensions.llNet.NaturalNumber1"/ > < /extendable >< /extendable >< /netTypeSpecification >< /netTypeSpecification >
Extendables Objects
Net Net Arc Arc Place Place Transition Transition Extension Extension
Extension Objects
MarkingMarking InscriptionInscription FiringRuleFiringRule ModeMode
Marking // // Esta classe descreve a coleção de tokens em um lugar de uma rede de Petri Esta classe descreve a coleção de tokens em um lugar de uma rede de Petri
public abstract class Marking public abstract class Marking extends Extension implements Inscription {extends Extension implements Inscription { // / Returns true if marking is contained in this marking./ Returns true if marking is contained in this marking. abstract public boolean contains(Marking marking);abstract public boolean contains(Marking marking);// // Adds the markings. This method is called byAdds the markings. This method is called by the add(Marking marking) method the add(Marking marking) method of thisof this// // marking.marking.abstract protected void localAdd(Marking marking);abstract protected void localAdd(Marking marking);// / Subtracts the markings. This method is called by/ Subtracts the markings. This method is called by the add(Marking marking) methodthe add(Marking marking) method of of // / / this marking.this marking.abstract protected void localSub(Marking marking);abstract protected void localSub(Marking marking); ... ... } // public interface Marking} // public interface Marking
Inscription
Esta classe descreve inscrições de Esta classe descreve inscrições de arcosarcos
public interface Inscription { public interface Inscription { Marking evaluate(); Marking evaluate(); } }
FiringRulepublic interface FiringRule {public interface FiringRule { // Fires the set of {@link Transition transitions} given by transitions. // Fires the set of {@link Transition transitions} given by transitions. // The transitions are fired simultaneously. // The transitions are fired simultaneously. void fire(Vector transitions); void fire(Vector transitions);
// Returns the set of all simultaneously fireable sets (steps) of transitions. // Returns the set of all simultaneously fireable sets (steps) of transitions. Vector getAllSteps(); Vector getAllSteps();
// Returns a simultaneously fireable set (step) of transitions. // Returns a simultaneously fireable set (step) of transitions. Vector getStep(); Vector getStep();
// Returns whether a set of transitions is simultaneously fireable. // Returns whether a set of transitions is simultaneously fireable. boolean isStep( Vector transitions); boolean isStep( Vector transitions); ......} // public interface FiringRule} // public interface FiringRule
Mode Esta classe descreve o modo de disparo de uma Esta classe descreve o modo de disparo de uma
transiçãotransição Ele será usado para transformar a inscrição de um arco Ele será usado para transformar a inscrição de um arco
em uma marcação do tipo de rede de Petri, de acordo em uma marcação do tipo de rede de Petri, de acordo com o modo de disparocom o modo de disparo
public interface Mode {public interface Mode { // An inscription of an arc// An inscription of an arc is evaluatedis evaluated to a to a //// m marking depending on this mode.arking depending on this mode. Marking evaluate( Inscription inscription); Marking evaluate( Inscription inscription); } // public interface Mode} // public interface Mode
Escrevendo aplicações com PNK Cada aplicação tem que estender a classe Cada aplicação tem que estender a classe
MetaApplicationMetaApplication para herdar importantes para herdar importantes funcionalidades básicasfuncionalidades básicas
Aplicação pode definir seu nome uma um campo Aplicação pode definir seu nome uma um campo de classe estático chamado de classe estático chamado staticAppNamestaticAppName
Aplicação deve implementar método run()Aplicação deve implementar método run() Interface Interface FiringRuleFiringRule deve ser implementada deve ser implementada
Aplicação simplespackage de.huberlin.informatik.pnk.app;package de.huberlin.informatik.pnk.app;
//import list here;//import list here;
public class BspApplication1 extends MetaApplication {public class BspApplication1 extends MetaApplication {public static String staticAppName = "BspApplication1";public static String staticAppName = "BspApplication1";
public BspApplication1(ApplicationControl ac) {public BspApplication1(ApplicationControl ac) { super(ac);super(ac);}}public void run() {public void run() {
System.out.println(" Application started ###############");System.out.println(" Application started ###############");this.quitMe();this.quitMe();
}}}}
Aplicação Simulatorpackage de.huberlin.informatik.pnk.app;package de.huberlin.informatik.pnk.app;
// import list here;// import list here;
// This class implements the standard PNK simulator application.// This class implements the standard PNK simulator application.public class Simulator extends MetaApplication {public class Simulator extends MetaApplication { public boolean startAsThread = true;public boolean startAsThread = true; public static String staticAppName = "Simulator"; public static String staticAppName = "Simulator";
public Simulator(ApplicationControl ac) {public Simulator(ApplicationControl ac) { super(ac);super(ac); }} // Start the simulator, that means:// Start the simulator, that means: // 1. Get the FiringRule for the net and// 1. Get the FiringRule for the net and // 2. call its method simulateWithUserInteraction// 2. call its method simulateWithUserInteraction public void run() {public void run() { FiringRule rule = (FiringRule) net.getExtension("firingRule");FiringRule rule = (FiringRule) net.getExtension("firingRule"); rule.simulateWithUserInteraction(this);rule.simulateWithUserInteraction(this); }}} // Simulator} // Simulator
SimpleRulepublic class SimpleRule extends FiringRule {public class SimpleRule extends FiringRule { ...... public void simulateWithUserInteraction(MetaApplication app) {public void simulateWithUserInteraction(MetaApplication app) { checkContextAndParseExtensions();checkContextAndParseExtensions(); ApplicationControl ac = app.getApplicationControl();ApplicationControl ac = app.getApplicationControl(); Net net = (Net) getGraph();Net net = (Net) getGraph(); Vector concessioned = getAllConcessioned( ); //all concessioned transitionsVector concessioned = getAllConcessioned( ); //all concessioned transitions
if(conc == null || conc.isEmpty()) return;if(conc == null || conc.isEmpty()) return; Transition transition = (Transition) (new SelectObjectAction(ac, net, app, Transition transition = (Transition) (new SelectObjectAction(ac, net, app,
concessioned)).invokeAction();concessioned)).invokeAction();
while(transition != null) {while(transition != null) { fire(transition);fire(transition); concessioned = getAllConcessioned();concessioned = getAllConcessioned(); if(concessioned == null || concessioned.isEmpty()) return;if(concessioned == null || concessioned.isEmpty()) return; transition = (Transition) (new SelectObjectAction(ac, net, app, concessioned)).invokeAction();transition = (Transition) (new SelectObjectAction(ac, net, app, concessioned)).invokeAction(); }} }} ...... } // class SimpleRule} // class SimpleRule
Resumo PNK é uma infra-estrutura para a construção de PNK é uma infra-estrutura para a construção de
ferramentas baseadas em Redes de Petriferramentas baseadas em Redes de Petri PNK permite e definição de novos tipos de redesPNK permite e definição de novos tipos de redes PNK permite a criação de aplicações com ênfase PNK permite a criação de aplicações com ênfase
dada à funcionalidadedada à funcionalidade PNK permite interfaceamento com ferramentas de PNK permite interfaceamento com ferramentas de
rede de Petri existentesrede de Petri existentes
Referências PNK User´s Manual. URL: PNK User´s Manual. URL:
http://www.informatik.hu-berlin.de/top/pnk/doku/pnk-guide/quickStart.htmlhttp://www.informatik.hu-berlin.de/top/pnk/doku/pnk-guide/quickStart.html Petri Net Kernel. Petri Net Kernel. URL:http://www.informatik.hu-berlin.de/top/pnk/URL:http://www.informatik.hu-berlin.de/top/pnk/ Reiner Schulz. The Petri Net Kernel: File Format Documentation. März 1999 Reiner Schulz. The Petri Net Kernel: File Format Documentation. März 1999
URL: URL: http://www.informatik.hu-berlin.de/top/pnk/literatur/pnkFileFormatExt.pshttp://www.informatik.hu-berlin.de/top/pnk/literatur/pnkFileFormatExt.ps
Ekkart Kindler , Frank Oschmann.The Petri Net Kernel: An INA-Ekkart Kindler , Frank Oschmann.The Petri Net Kernel: An INA-Pilot.Oktober 1998 URL: Pilot.Oktober 1998 URL: http://www.informatik.hu-berlin.de/top/pnk/literatur/AWPN98-INA-PNK.pshttp://www.informatik.hu-berlin.de/top/pnk/literatur/AWPN98-INA-PNK.ps
J. Hauptmann , B. Hohberg , E. Kindler , I. Schwenzer , M. Weber. The Petri J. Hauptmann , B. Hohberg , E. Kindler , I. Schwenzer , M. Weber. The Petri Net Kernel - Documentation of the Application Interface. Februar 1998. URL: Net Kernel - Documentation of the Application Interface. Februar 1998. URL: http://www.informatik.hu-berlin.de/top/pnk/literatur/PNK-Doc-engl.pshttp://www.informatik.hu-berlin.de/top/pnk/literatur/PNK-Doc-engl.ps