<?xml version="1.0"?>


<!-- Alphabetic Pattern Constraints (APC) are particular regular
expression used in language theory [A..][PW94] and in a
regular model checking context [BMT01][CHM08].

A APC expression on a finite alphabet S is a finite union of
expressions of the form

A0*.a1.A1*.....Ak.ak.A{k+1}*

where the Ai's are subset of S and the ai's are elements of S.

We use the following grammar for APC on S={a,b,c,d}:

S -> a | b | c | d
Sub -> Set (S)
Star -> Sub*
Prod -> Star.S
E -> Seq(Prod)
APC1 -> E.star
APC -> sequence(APC1)


Bibliography

[A91] Mustapha Arfi: Opérations polynomiales et hiérarchies de
concaténation. Theor. Comput. Sci. 91(1): 71-84 (1991)

[PW94] J.-E. Pin and P. Weil, Polynomial closure and unambiguous
product, in 22th ICALP, Berlin, (1995), 348-359, Lecture Notes in
Computer Science 944, Springer Verlag

[BMT01] A. Bouajjani, A. Muscholl, T. Touili. Permutation Rewriting
and Algorithmic Verification , Proc. of LICS'01, IEEE Computer
Society, pp. 399-408, 2001

[CHM08] Efficiency of Automata in Semi-Commutation Verification
Techniques. RAIRO, Theoretical Informatics and Applications,
42(2):197-215, March 2008. 

Warnings:
No object of sizes  1 and 2.
whose size is 
-->


<!DOCTYPE specification SYSTEM "seed.dtd">



<specification>
  <start idref="all"/> 

  <sequence id="all"> <!-- defintion of APC-->
    <symbol value="."/>
    <child idref="Prod"/>
  </sequence> 

  <constants id="S"> <!-- defintion of the alphabet-->
    <symbol value="a"/>
    <symbol value="b"/>
    <symbol value="c"/>
    <symbol value="d"/>
  </constants>

  <constants_set id="Sub">  <!-- defintion of subsets of S-->
    <child idref="S"/>
  </constants_set>

  <unary id="Star"> <!-- stars of subsets of S-->
    <symbol value="*"/>
    <child idref="Sub"/>
  </unary>

  <binary id="Prod0"> <!-- languages of the form Ai*a -->
    <symbol value="."/>
    <child idref="Star"/>
    <child idref="S"/>
  </binary>

  
  <sequence id="Prod1"> <!-- languages of the form A0*a1A1*...ak with
    k greater than 0 --> 
    <symbol value="."/> 
    <child idref="Prod0"/>
  </sequence>
  
  
  <binary id="Prod2"> <!-- languages of the form A0*a1A1*...akAk with
    k greater than 0 --> 
    <symbol value="."/> 
    <child idref="Prod1"/>
    <child idref="Star"/>
  </binary>
  
  

  <union id="Prod"> <!-- languages of the form A0*a1A1*...akAk* -->
    <child idref="Star"/> <!-- if k=0 -->
    <child idref="Prod2"/> <!-- if k differs from 0 -->
  </union>
  
  
</specification>
