From e533c65f2705c900e00c02bd3ddb9726480a2782 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Tue, 11 Oct 2016 11:03:41 +0200
Subject: [PATCH] template PrefixRankedNonlinearPattern tree

---
 .../src/arbology/exact/ExactPatternMatch.cpp  |   4 +-
 .../src/arbology/exact/ExactPatternMatch.h    |   2 +-
 .../exact/ReversedBadCharacterShiftTable.cpp  |   6 +-
 .../exact/ReversedBadCharacterShiftTable.h    |   2 +-
 .../exact/ReversedBoyerMooreHorspool.cpp      |   4 +-
 .../exact/ReversedBoyerMooreHorspool.h        |   2 +-
 alib2data/src/string/LinearString.cpp         |   2 +-
 alib2data/src/string/LinearString.h           |   4 +-
 alib2data/src/tree/TreeFeatures.h             |   1 +
 .../ranked/PrefixRankedNonlinearPattern.cpp   | 161 +-----------
 .../ranked/PrefixRankedNonlinearPattern.h     | 239 +++++++++++++++---
 11 files changed, 224 insertions(+), 203 deletions(-)

diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
index 5ef915c2a4..f2ad448336 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
@@ -166,7 +166,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree <
 
 auto ExactPatternMatchPrefixRankedPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ExactPatternMatch::match );
 
-std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ) {
+std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ) {
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
 	std::map < std::ranked_symbol < >, alphabet::Symbol > variablesSetting;
 
@@ -203,7 +203,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree <
 	return occ;
 }
 
-auto ExactPatternMatchPrefixRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ExactPatternMatch::match );
 
 std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern ) {
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h
index 2005a1a473..09a9ea162a 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h
@@ -34,7 +34,7 @@ public:
 	static std::set < unsigned > match ( const tree::RankedTree < > & subject, const tree::RankedNonlinearPattern < > & pattern );
 
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern );
-	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern );
 
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern );
diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
index bf2e886b2c..4fb5eebb81 100644
--- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
+++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp
@@ -83,12 +83,12 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs
 auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( ReversedBadCharacterShiftTable::bcs );
 
 std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedPattern < > & pattern ) {
-	return bcs ( tree::PrefixRankedNonlinearPattern ( pattern ) );
+	return bcs ( tree::PrefixRankedNonlinearPattern < > ( pattern ) );
 }
 
 auto ReversedBadCharacterShiftTablePrefixRankedPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedPattern < > > ( ReversedBadCharacterShiftTable::bcs );
 
-std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedNonlinearPattern & pattern ) {
+std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedNonlinearPattern < > & pattern ) {
 	const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( );
 
 	std::map < std::ranked_symbol < >, size_t > bcs;
@@ -130,7 +130,7 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs
 	return bcs;
 }
 
-auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
index c2d414e8e4..df1e9df914 100644
--- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
+++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h
@@ -35,7 +35,7 @@ public:
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarPattern < > & pattern );
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern );
 	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedPattern < > & pattern );
-	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedNonlinearPattern & pattern );
+	static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedNonlinearPattern < > & pattern );
 
 };
 
diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
index 77b374b7e7..9feef4ebe9 100644
--- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
+++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
@@ -184,7 +184,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank
 
 auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ReversedBoyerMooreHorspool::match );
 
-std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ) {
+std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ) {
 	std::set < unsigned > occ;
 	std::map < std::ranked_symbol < >, size_t > bcs = ReversedBadCharacterShiftTable::bcs ( pattern ); // NOTE: the subjects alphabet must be a subset or equal to the pattern
 	std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject );
@@ -239,7 +239,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank
 	return occ;
 }
 
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
index ca6d55881d..51028ea72f 100644
--- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
+++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h
@@ -33,7 +33,7 @@ public:
 	static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern );
 	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern );
-	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern );
+	static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern );
 
 };
 
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index bd5fdf2e36..4ce1aa42fd 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -20,7 +20,7 @@ auto linearStringParserRegister2 = xmlApi < alib::Object >::ParserRegister < str
 auto LinearStringFromEpsilon = castApi::CastRegister < string::LinearString < >, string::Epsilon < > > ( );
 auto LinearStringFromPrefixRankedTree = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedTree < > > ( );
 auto LinearStringFromPrefixRankedPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedPattern < > > ( );
-auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedNonlinearPattern > ( );
+auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedNonlinearPattern < > > ( );
 auto LinearStringFromPrefixRankedBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarTree < > > ( );
 auto LinearStringFromPrefixRankedBarPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarPattern < > > ( );
 auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarNonlinearPattern > ( );
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index b15a6bf404..1d1523d297 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -41,7 +41,7 @@ public:
 	explicit LinearString ( );
 	explicit LinearString ( const tree::PrefixRankedTree < > & tree );
 	explicit LinearString ( const tree::PrefixRankedPattern < > & tree );
-	explicit LinearString ( const tree::PrefixRankedNonlinearPattern & tree );
+	explicit LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree );
 	explicit LinearString ( const tree::PrefixRankedBarTree < > & tree );
 	explicit LinearString ( const tree::PrefixRankedBarPattern < > & tree );
 	explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree );
@@ -151,7 +151,7 @@ LinearString < SymbolType >::LinearString ( const tree::PrefixRankedPattern < >
 }
 
 template < class SymbolType >
-LinearString < SymbolType >::LinearString ( const tree::PrefixRankedNonlinearPattern & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) {
+LinearString < SymbolType >::LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) {
 }
 
 template < class SymbolType >
diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h
index d140a65833..838b1e8f14 100644
--- a/alib2data/src/tree/TreeFeatures.h
+++ b/alib2data/src/tree/TreeFeatures.h
@@ -43,6 +43,7 @@ template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsi
 class PrefixRankedBarTree;
 template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned >
 class PrefixRankedPattern;
+template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned >
 class PrefixRankedNonlinearPattern;
 template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned >
 class PrefixRankedBarPattern;
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
index f986f74f8a..b5caaf11bb 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp
@@ -6,166 +6,23 @@
  */
 
 #include "PrefixRankedNonlinearPattern.h"
-
-#include <sstream>
-#include <algorithm>
-#include <deque>
-
-#include "PrefixRankedTree.h"
-#include "PrefixRankedPattern.h"
-#include "RankedTree.h"
-#include "RankedPattern.h"
-#include "RankedNonlinearPattern.h"
-
-#include <sax/FromXMLParserHelper.h>
-#include "../common/TreeFromXMLParser.h"
-#include "../common/TreeToXMLComposer.h"
 #include "../Tree.h"
 #include "../RankedTreeWrapper.h"
 #include <object/Object.h>
 #include <core/xmlApi.hpp>
 #include <core/castApi.hpp>
 
-#include "../../alphabet/SubtreeWildcardSymbol.h"
-
-namespace tree {
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ) : std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) {
-	setContent ( std::move ( data ) );
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, nonlinearVariables, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < > > { subtreeWildcard } + nonlinearVariables, data ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, {}, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < > > { subtreeWildcard }, data ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
-}
-
-PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
-}
-
-std::vector < std::ranked_symbol < > > PrefixRankedNonlinearPattern::toPrefixRanked ( const std::tree < std::ranked_symbol < > > & tree ) {
-	std::vector < std::ranked_symbol < > > res;
-
-	for ( std::tree < std::ranked_symbol < > >::const_prefix_iterator iter = tree.prefix_begin ( ); iter != tree.prefix_end ( ); ++iter )
-		res.push_back ( * iter );
-
-	return res;
-}
-
-RankedTreeBase * PrefixRankedNonlinearPattern::clone ( ) const {
-	return new PrefixRankedNonlinearPattern ( * this );
-}
-
-RankedTreeBase * PrefixRankedNonlinearPattern::plunder ( ) && {
-	return new PrefixRankedNonlinearPattern ( std::move ( * this ) );
-}
-
-const std::vector < std::ranked_symbol < > > & PrefixRankedNonlinearPattern::getContent ( ) const {
-	return this->m_Data;
-}
-
-void PrefixRankedNonlinearPattern::setContent ( std::vector < std::ranked_symbol < > > data ) {
-	arityChecksum ( data );
-
-	std::set < std::ranked_symbol < > > minimalAlphabet ( data.begin ( ), data.end ( ) );
-	std::set < std::ranked_symbol < > > unknownSymbols;
-	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
-
-	if ( unknownSymbols.size ( ) > 0 )
-		throw TreeException ( "Input symbols not in the alphabet." );
-
-	this->m_Data = std::move ( data );
-}
-
-void PrefixRankedNonlinearPattern::arityChecksum ( const std::vector < std::ranked_symbol < > > & data ) {
-	int arityChecksum = 1;
-
-	for ( const std::ranked_symbol < > & symbol : data ) {
-		arityChecksum += symbol.getRank ( ).getData ( );
-		arityChecksum -= 1;
-	}
-
-	if ( arityChecksum != 0 ) throw TreeException ( "The string does not form a tree" );
-}
-
-bool PrefixRankedNonlinearPattern::isEmpty ( ) const {
-	return this->m_Data.size ( ) == 0;
-}
-
-int PrefixRankedNonlinearPattern::compare ( const PrefixRankedNonlinearPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ) );
-	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ) );
-
-	std::compare < decltype ( first ) > comp;
-
-	return comp ( first, second );
-}
-
-void PrefixRankedNonlinearPattern::operator >>( std::ostream & out ) const {
-	out << "(PrefixRankedNonlinearPattern ";
-
-	for ( const std::ranked_symbol < > & symbol : this->m_Data )
-		out << symbol;
-
-	out << ")";
-}
-
-PrefixRankedNonlinearPattern::operator std::string ( ) const {
-	std::stringstream ss;
-	ss << "\"";
-
-	for ( const std::ranked_symbol < > & symbol : this->m_Data )
-		ss << symbol;
-
-	ss << "\"";
-	return std::move ( ss ).str ( );
-}
-
-PrefixRankedNonlinearPattern PrefixRankedNonlinearPattern::parse ( std::deque < sax::Token >::iterator & input ) {
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) );
-	std::ranked_symbol < > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input );
-	std::set < std::ranked_symbol < > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input );
-	std::set < std::ranked_symbol < > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input );
-	std::vector < std::ranked_symbol < > > data = TreeFromXMLParser::parseRankedLinearContent ( input );
-	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) );
-
-	return PrefixRankedNonlinearPattern ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) );
-}
-
-void PrefixRankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const {
-	out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
-	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) );
-	TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) );
-	TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) );
-	TreeToXMLComposer::composeContent ( out, m_Data );
-	out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
-}
-
-} /* namespace tree */
-
 namespace alib {
 
-auto prefixRankedNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( );
-auto prefixRankedNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( );
-auto prefixRankedNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( );
+auto prefixRankedNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( );
+auto prefixRankedNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( );
+auto prefixRankedNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( );
 
-auto PrefixRankedNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedTree < > > ( );
-auto PrefixRankedNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedPattern < > > ( );
-auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedNonlinearPattern < > > ( );
-auto PrefixRankedNonlinearPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::PrefixRankedTree < > > ( );
-auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::PrefixRankedPattern < > > ( );
-auto PrefixRankedNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedNonlinearPattern > ( ::tree::PrefixRankedNonlinearPattern::getXmlTagName ( ) );
+auto PrefixRankedNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedTree < > > ( );
+auto PrefixRankedNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedPattern < > > ( );
+auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( );
+auto PrefixRankedNonlinearPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedTree < > > ( );
+auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedPattern < > > ( );
+auto PrefixRankedNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedNonlinearPattern < > > ( ::tree::PrefixRankedNonlinearPattern < >::getXmlTagName ( ) );
 
 } /* namespace alib */
diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
index 307cc11cdb..6e4a8a2ac7 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h
@@ -11,12 +11,21 @@
 #include <set>
 #include <vector>
 #include <tree>
+#include <sstream>
+#include <algorithm>
+#include <deque>
+
 #include <core/components.hpp>
+#include <sax/FromXMLParserHelper.h>
+#include "alphabet/ranked_symbol.hpp"
 
 #include "../TreeFeatures.h"
 #include "../TreeException.h"
-#include "alphabet/ranked_symbol.hpp"
 #include "../RankedTreeBase.h"
+#include "../common/TreeFromXMLParser.h"
+#include "../common/TreeToXMLComposer.h"
+
+#include "../../alphabet/SubtreeWildcardSymbol.h"
 
 namespace tree {
 
@@ -28,15 +37,16 @@ class NonlinearAlphabet;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
-	std::vector < std::ranked_symbol < > > m_Data;
+template < class SymbolType, class RankType >
+class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > {
+	std::vector < std::ranked_symbol < SymbolType, RankType > > m_Data;
 
-	static std::vector < std::ranked_symbol < > > toPrefixRanked ( const std::tree < std::ranked_symbol < > > & tree );
+	static std::vector < std::ranked_symbol < SymbolType, RankType > > toPrefixRanked ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree );
 
 public:
-	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data );
-	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data );
-	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data );
+	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
+	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
+	explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data );
 	explicit PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree );
 	explicit PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree );
 	explicit PrefixRankedNonlinearPattern ( const RankedTree < > & tree );
@@ -49,27 +59,27 @@ public:
 	/**
 	 * @return List of symbols forming tree (const version).
 	 */
-	const std::vector < std::ranked_symbol < > > & getContent ( ) const;
+	const std::vector < std::ranked_symbol < SymbolType, RankType > > & getContent ( ) const;
 
-	const std::set < std::ranked_symbol < > > & getAlphabet ( ) const {
-		return accessComponent < GeneralAlphabet > ( ).get ( );
+	const std::set < std::ranked_symbol < SymbolType, RankType > > & getAlphabet ( ) const {
+		return this->template accessComponent < GeneralAlphabet > ( ).get ( );
 	}
 
-	void extendAlphabet ( const std::set < std::ranked_symbol < > > & symbols ) {
-		accessComponent < GeneralAlphabet > ( ).add ( symbols );
+	void extendAlphabet ( const std::set < std::ranked_symbol < SymbolType, RankType > > & symbols ) {
+		this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
 	}
 
-	const std::ranked_symbol < > & getSubtreeWildcard ( ) const {
-		return accessElement < SubtreeWildcard > ( ).get ( );
+	const std::ranked_symbol < SymbolType, RankType > & getSubtreeWildcard ( ) const {
+		return this->template accessElement < SubtreeWildcard > ( ).get ( );
 	}
 
-	const std::set < std::ranked_symbol < > > & getNonlinearVariables ( ) const {
-		return accessComponent < NonlinearAlphabet > ( ).get ( );
+	const std::set < std::ranked_symbol < SymbolType, RankType > > & getNonlinearVariables ( ) const {
+		return this->template accessComponent < NonlinearAlphabet > ( ).get ( );
 	}
 
-	void setContent ( std::vector < std::ranked_symbol < > > data );
+	void setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data );
 
-	void arityChecksum ( const std::vector < std::ranked_symbol < > > & data );
+	void arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data );
 
 	/**
 	 * @return true if tree is an empty word (vector length is 0)
@@ -101,57 +111,210 @@ public:
 
 } /* namespace tree */
 
+#include "PrefixRankedTree.h"
+#include "PrefixRankedPattern.h"
+#include "RankedTree.h"
+#include "RankedPattern.h"
+#include "RankedNonlinearPattern.h"
+
+namespace tree {
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) {
+	setContent ( std::move ( data ) );
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < SymbolType, RankType > > { subtreeWildcard } + nonlinearVariables, data ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, {}, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < SymbolType, RankType > > { subtreeWildcard }, data ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) {
+}
+
+template < class SymbolType, class RankType >
+std::vector < std::ranked_symbol < SymbolType, RankType > > PrefixRankedNonlinearPattern < SymbolType, RankType >::toPrefixRanked ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree ) {
+	std::vector < std::ranked_symbol < SymbolType, RankType > > res;
+
+	for ( typename std::tree < std::ranked_symbol < SymbolType, RankType > >::const_prefix_iterator iter = tree.prefix_begin ( ); iter != tree.prefix_end ( ); ++iter )
+		res.push_back ( * iter );
+
+	return res;
+}
+
+template < class SymbolType, class RankType >
+RankedTreeBase * PrefixRankedNonlinearPattern < SymbolType, RankType >::clone ( ) const {
+	return new PrefixRankedNonlinearPattern ( * this );
+}
+
+template < class SymbolType, class RankType >
+RankedTreeBase * PrefixRankedNonlinearPattern < SymbolType, RankType >::plunder ( ) && {
+	return new PrefixRankedNonlinearPattern ( std::move ( * this ) );
+}
+
+template < class SymbolType, class RankType >
+const std::vector < std::ranked_symbol < SymbolType, RankType > > & PrefixRankedNonlinearPattern < SymbolType, RankType >::getContent ( ) const {
+	return this->m_Data;
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedNonlinearPattern < SymbolType, RankType >::setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data ) {
+	arityChecksum ( data );
+
+	std::set < std::ranked_symbol < SymbolType, RankType > > minimalAlphabet ( data.begin ( ), data.end ( ) );
+	std::set < std::ranked_symbol < SymbolType, RankType > > unknownSymbols;
+	std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) );
+
+	if ( unknownSymbols.size ( ) > 0 )
+		throw TreeException ( "Input symbols not in the alphabet." );
+
+	this->m_Data = std::move ( data );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedNonlinearPattern < SymbolType, RankType >::arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data ) {
+	int arityChecksum = 1;
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : data ) {
+		arityChecksum += symbol.getRank ( ).getData ( );
+		arityChecksum -= 1;
+	}
+
+	if ( arityChecksum != 0 ) throw TreeException ( "The string does not form a tree" );
+}
+
+template < class SymbolType, class RankType >
+bool PrefixRankedNonlinearPattern < SymbolType, RankType >::isEmpty ( ) const {
+	return this->m_Data.size ( ) == 0;
+}
+
+template < class SymbolType, class RankType >
+int PrefixRankedNonlinearPattern < SymbolType, RankType >::compare ( const PrefixRankedNonlinearPattern & other ) const {
+	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ) );
+	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ) );
+
+	std::compare < decltype ( first ) > comp;
+
+	return comp ( first, second );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedNonlinearPattern < SymbolType, RankType >::operator >>( std::ostream & out ) const {
+	out << "(PrefixRankedNonlinearPattern ";
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data )
+		out << symbol;
+
+	out << ")";
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType >::operator std::string ( ) const {
+	std::stringstream ss;
+	ss << "\"";
+
+	for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data )
+		ss << symbol;
+
+	ss << "\"";
+	return std::move ( ss ).str ( );
+}
+
+template < class SymbolType, class RankType >
+PrefixRankedNonlinearPattern < SymbolType, RankType > PrefixRankedNonlinearPattern < SymbolType, RankType >::parse ( std::deque < sax::Token >::iterator & input ) {
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) );
+	std::ranked_symbol < SymbolType, RankType > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input );
+	std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input );
+	std::set < std::ranked_symbol < SymbolType, RankType > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input );
+	std::vector < std::ranked_symbol < SymbolType, RankType > > data = TreeFromXMLParser::parseRankedLinearContent ( input );
+	sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) );
+
+	return PrefixRankedNonlinearPattern < SymbolType, RankType > ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) );
+}
+
+template < class SymbolType, class RankType >
+void PrefixRankedNonlinearPattern < SymbolType, RankType >::compose ( std::deque < sax::Token > & out ) const {
+	out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT );
+	TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) );
+	TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) );
+	TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) );
+	TreeToXMLComposer::composeContent ( out, m_Data );
+	out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT );
+}
+
+} /* namespace tree */
+
 namespace std {
 
-template < >
-class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::GeneralAlphabet > {
+template < class SymbolType, class RankType >
+class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::GeneralAlphabet > {
 public:
-	static bool used ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( );
+	static bool used ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		const std::vector < std::ranked_symbol < SymbolType, RankType > > & content = pattern.getContent ( );
 
-		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol;
+		return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol;
 	}
 
-	static bool available ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 		return true;
 	}
 
-	static void valid ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 	}
 };
 
-template < >
-class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::NonlinearAlphabet > {
+template < class SymbolType, class RankType >
+class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::NonlinearAlphabet > {
 public:
-	static bool used ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) {
+	static bool used ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) {
 		return false;
 	}
 
-	static bool available ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) {
+	static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) {
 		if ( symbol.getRank ( ).getData ( ) != 0 )
 			throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
 
-		if ( pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol )
+		if ( pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol )
 			throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as nonlinear variable since it is already subtree wildcard" );
 	}
 };
 
-template < >
-class ElementConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::SubtreeWildcard > {
+template < class SymbolType, class RankType >
+class ElementConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::SubtreeWildcard > {
 public:
-	static bool available ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) {
-		return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
+	static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) {
+		return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
 	}
 
-	static void valid ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) {
+	static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) {
 		if ( symbol.getRank ( ).getData ( ) != 0 )
 			throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
 
-		if ( pattern.accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
+		if ( pattern.template accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) )
 			throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as subtree wildcard since it is already nonlinear variable" );
 	}
 };
-- 
GitLab