<?xml version="1.0" encoding="UTF-8"?>
<TEI xml:space="preserve" xmlns="http://www.tei-c.org/ns/1.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.tei-c.org/ns/1.0 https://raw.githubusercontent.com/kermitt2/grobid/master/grobid-home/schemas/xsd/Grobid.xsd"
 xmlns:xlink="http://www.w3.org/1999/xlink">
	<teiHeader xml:lang="en">
		<fileDesc>
			<titleStmt>
				<title level="a" type="main">Combining Static and Dynamic Techniques for Refactoring Industrial FSMs in C++</title>
			</titleStmt>
			<publicationStmt>
				<publisher/>
				<availability status="unknown"><licence/></availability>
			</publicationStmt>
			<sourceDesc>
				<biblStruct>
					<analytic>
						<author role="corresp">
							<persName><forename type="first">Mathijs</forename><surname>Schuts</surname></persName>
							<email>mathijs.schuts@tno.nl</email>
							<affiliation key="aff0">
								<orgName type="institution">Philips</orgName>
								<address>
									<settlement>Best</settlement>
									<country key="NL">The Netherlands</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Jozef</forename><surname>Hooman</surname></persName>
							<affiliation key="aff1">
								<orgName type="institution">TNO-ESI</orgName>
								<address>
									<settlement>Eindhoven</settlement>
									<country key="NL">The Netherlands</country>
								</address>
							</affiliation>
						</author>
						<author>
							<persName><forename type="first">Marco</forename><surname>Alonso</surname></persName>
							<affiliation key="aff0">
								<orgName type="institution">Philips</orgName>
								<address>
									<settlement>Best</settlement>
									<country key="NL">The Netherlands</country>
								</address>
							</affiliation>
						</author>
						<title level="a" type="main">Combining Static and Dynamic Techniques for Refactoring Industrial FSMs in C++</title>
					</analytic>
					<monogr>
						<idno type="ISSN">1613-0073</idno>
					</monogr>
					<idno type="MD5">0F420276DFDF2DC8A1A3ABE88320397C</idno>
				</biblStruct>
			</sourceDesc>
		</fileDesc>
		<encodingDesc>
			<appInfo>
				<application version="0.7.2" ident="GROBID" when="2025-04-23T19:00+0000">
					<desc>GROBID - A machine learning software for extracting information from scholarly documents</desc>
					<ref target="https://github.com/kermitt2/grobid"/>
				</application>
			</appInfo>
		</encodingDesc>
		<profileDesc>
			<textClass>
				<keywords>
					<term>Refactoring</term>
					<term>Metaprogramming</term>
					<term>Domain Specific Language</term>
					<term>Finite State Machine</term>
					<term>C++</term>
					<term>Abstract Syntax Tree</term>
					<term>Active Model Learning</term>
					<term>Model Checking</term>
					<term>Equivalence Checking</term>
					<term>Model Based Development</term>
					<term>Industry Case</term>
				</keywords>
			</textClass>
			<abstract>
<div xmlns="http://www.tei-c.org/ns/1.0"><p>Software maintenance requires a significant amount of time and effort. One of the tasks involved in this process is to replace outdated frameworks with newer, state-of-the-art alternatives. For such a replacement, static and dynamic techniques can be utilized. Using a static technique, such as metaprogramming, the source code can be inspected in a whitebox manner to gain insight in its functionality. By means of a dynamic technique, such as Active Model Learning (AML), the behavior of the code can be extracted in a blackbox manner. Since both techniques have their advantages and disadvantages, we propose a novel combination of static and dynamic analysis techniques that complements each other. Model checking is used to check the equivalence of the models obtained by the different techniques. The approach has been applied at Philips to upgrade a legacy framework written in C++ to describe Finite State Machines (FSMs). This framework has been replaced by a more modern tool called Dezyne. By means of our new approach, we were able to semi-automatically replace 14 FSMs with high confidence in the preserved behavior.</p></div>
			</abstract>
		</profileDesc>
	</teiHeader>
	<text xml:lang="en">
		<body>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="1.">Introduction</head><p>High-tech systems have numerous components that serve various purposes, and they are often old or custom-made. Maintaining these legacy components can be a significant burden on developers <ref type="bibr" target="#b0">[1]</ref>. Modern software engineering practices offer alternatives to rudimentary coding methods for complex systems like supervisory control software. These alternative approaches include Domain Specific Languages (DSLs) that allow intuitive expression of state machines, improving the overall quality and maintainability of high-tech systems <ref type="bibr" target="#b1">[2]</ref>.</p><p>Working with both a legacy and a new framework for components can make maintaining a large code base more difficult. Replacing an old framework with a newer one enhances maintenance efficiency. The majority of effort is in refactoring existing components to use the new framework instead of the obsolete one, but ensuring behavior preservation after changes requires additional effort.</p><p>The challenge lies in replacing only outdated framework calls without altering other components' code. Regression test suites usually do not provide sufficient confidence that behavior has been preserved because of limited code coverage. Hence, the challenge is to ensure that changes have been implemented correctly and preserve the original behavior.</p><p>Static techniques like metaprogramming can analyze software internals but cannot extract meaning; dynamic techniques observe semantics but lose internal information. The Rascal metaprogramming language <ref type="bibr" target="#b2">[3]</ref> is an example of a static technique that considers source code as data, allowing it to identify, for instance, the names of internal functions. It achieves this by parsing the source code into an Abstract Syntax Tree (AST), which can be used to construct a model like a Finite State Machine (FSM) representing the behavior of a piece of source code. Static techniques, however, cannot extract the execution semantics from the source code <ref type="bibr" target="#b3">[4]</ref>. Hence, the use of metaprogramming for transformations faces challenges in determining the precise FSM semantics <ref type="bibr" target="#b4">[5]</ref>.</p><p>Dynamic techniques can execute the source code and generate a behavioral model that can be used to check if a new implementation has the same behavior as the legacy implementation. Active Model Learning (AML) <ref type="bibr" target="#b5">[6]</ref> is an example of a dynamic technique that can be applied to construct behavioral models from existing software. Figure <ref type="figure" target="#fig_0">1</ref> shows how a learner application interacts with the software for which a model has to be made, the so-called System Under Learning (SUL). The learner is provided with the set of possible input events that it can send to the SUL. When learning starts, the learner calls sequences of input events called Membership Queries (MQ) to the SUL. For every sequence of input events, the SUL replies with a sequence of output events. Before a new input events sequence is called, the learner resets the SUL to its initial state. After a number of MQs, the learner constructs a hypothesis which is a state machine model of the SUL behavior. This hypothesis is tested for conformance with the SUL by means of Equivalence Queries (EQ). EQs can either confirm the hypothesis -in this case the hypothesis is the final model-or otherwise it will return a counterexample. The learner uses the counterexample to continue learning and create a new hypothesis. The resulting model is a deterministic finite state machine <ref type="bibr" target="#b6">[7]</ref>. There are different learning algorithms available such as L* <ref type="bibr" target="#b6">[7]</ref>, TTT <ref type="bibr" target="#b7">[8]</ref> and L# <ref type="bibr" target="#b8">[9]</ref> for MQs and, i.e., Wp <ref type="bibr" target="#b9">[10]</ref> and I-ADS <ref type="bibr" target="#b10">[11]</ref> for EQs.</p><p>In Table <ref type="table">1</ref>, we compare static and dynamic techniques. It indicates that a combination of both techniques offers additional benefits over the use of each of them individually. Cannot inspect the internals of software.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Table 1</head><p>Comparing static and dynamic techniques Figure <ref type="figure" target="#fig_1">2</ref> shows how we integrate the two approaches to acquire models of legacy code. We use the mCRL2 model checker to check the equivalence of the two models <ref type="bibr" target="#b11">[12]</ref>. Note that when two finite state machines do not contain any unobservable internal transitions, trace equivalence and branch bisimulation equivalence coincide, and there is no difference between weak and strong equivalences <ref type="bibr" target="#b12">[13]</ref>.</p><p>Our approach is suitable for applications that meet the restrictions of AML which can be applied on data-independent control components, i.e., components where control decisions do not depend on input data. For a successful application of metaprogramming, the legacy code should contain a pattern that can be captured in a metaprogram. To justify the effort in creating such a metaprogram and have a good return of investment, there should be sufficient instances of the pattern.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Industrial application</head><p>Our refactoring approach has been applied to an industrial case that has the characteristics described above. It addresses a part of the code of an interventional X-ray system at Philips Image Guided Therapy (IGT). A legacy CppFSM framework is replaced with a new model-based FSM framework called Dezyne <ref type="bibr" target="#b13">[14]</ref>. Observe that static and dynamic techniques cover different aspects when refactoring state machines:</p><p>• With metaprogramming, we can preserve state names, but ensuring a semantics-preserving behavior is impossible. • With AML, we can extract the execution semantics, but we lose the state names. We applied our approach, which combines both techniques, to replace more than a dozen CppFSMs. The combination and an equivalence check increase the confidence that the behavior is preserved after refactoring.</p><p>To our knowledge, this paper presents the first instance of combining static and dynamic techniques to refactor industrial C++ code</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>Structure of the paper</head><p>The paper is organized as follows. Background on the used technologies is described in Section 2. In Section 3, we introduce the industrial application. Our approach is highlighted in Section 4. In Section 5, the results of applying our approach to the industrial case are presented. Concluding remarks can be found in Section 6.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="2.">Background</head><p>Related to our work is the book of Fowler on domain-specific languages <ref type="bibr" target="#b14">[15]</ref>. Fowler defines refactoring as changing the internals of source code without changing its usage while preserving its behavior. The manual creation of test cases is advocated before the start of the refactoring when the current test cases provide insufficient code coverage. After an improvement of the tests to get better code coverage, the source code can be manually refactored.</p><p>As an alternative to manually refactoring code, metaprogramming is a static technique used to analyze and transform source code. A metaprogram accesses source code as whitebox; all internals of the source code can be inspected. Such a static technique cannot acquire the behavior of the source when it is executed <ref type="bibr" target="#b3">[4]</ref>. Ivers et al. <ref type="bibr" target="#b15">[16]</ref> have also identified that preserving the semantics is a challenge. Especially when dealing with, for instance, function pointers it is difficult to extract the operational semantics <ref type="bibr" target="#b16">[17]</ref>.</p><p>Examples of metaprogramming languages are Rascal <ref type="bibr" target="#b2">[3]</ref>, Algebraic Specification Formalism + Syntax Definition Formalism (ASF+SDF) <ref type="bibr" target="#b17">[18]</ref>, Stratego <ref type="bibr" target="#b18">[19]</ref> and Turing eXtender Language (TXL) <ref type="bibr" target="#b19">[20]</ref>. The following metaprogramming languages are specialized for C++: CodeBoost <ref type="bibr" target="#b20">[21]</ref>, Design Maintenance System (DMS) <ref type="bibr" target="#b21">[22]</ref> and Proteus <ref type="bibr" target="#b22">[23]</ref>.</p><p>These metaprogramming languages have been applied in industry. At Google, the ClangMR <ref type="bibr" target="#b23">[24]</ref> has been used to refactor large C++ codebases. They refactored callers of deprecated APIs. The tool is based on the Clang compiler in combination with the MapReduce parallel processor. Mooij et al. <ref type="bibr" target="#b24">[25]</ref> refactored C++ code using small iterative steps. After the small code refactoring steps, a model was extracted from the source code before generating a new implementation. Schuts et al. <ref type="bibr" target="#b25">[26]</ref>   <ref type="bibr" target="#b26">[27]</ref>. The conversions written in this paper were all implemented in Rascal. For some we also used ClaiR.</p><p>Active Model Learning (AML) has been applied in several non-trivial cases. For instance, to learn models of network protocol implementations, such as SSH, SIP, TCP, TLS, and models of smart cards for banking and bio-metric passports <ref type="bibr" target="#b27">[28]</ref>. Model learning is also used in industry, e.g., at Canon to learn a controller of a high-end printing copier of 410 states and 77 stimuli was learned <ref type="bibr" target="#b28">[29]</ref>.</p><p>AML has also been applied in the context of manual refactoring. In <ref type="bibr" target="#b29">[30]</ref>, we describe a case at Philips where we learned a legacy implementation and a manually refactored implementation. Next we applied an equivalence checker to test if both implementations were equivalent. With this approach, we found issues in both implementations. After solving the issues, the models were equivalent. We also applied model learning and equivalence checking to test a model-to-model transformation from IBM Rhapsody to Dezyne <ref type="bibr" target="#b30">[31]</ref>.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.">Industrial Application</head><p>Because of confidentiality we cannot share models from the interventional X-ray system and instead we explain the techniques using a vending machine example which is introduced in Section 3.1. Section 3.2 presents the CppFSM framework which is the legacy framework we want to remove from the code base. The target Dezyne framework of our transformation is described in Section 3.3.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.1.">Vending Machine Case</head><p>Table <ref type="table" target="#tab_2">2</ref> provides the state machine of the vending machine. The initial state is idle. From this state, a two Euro coin can be inserted. When this happens, the vending machine displays select beverage and transitions to the paid state. In the paid state there are two transitions: one for choosing coffee and yet another self transition for inserting a two Euro coin. On the other hand, coffee can be made black, or with sugar, milk or both. In all states -except from the idle state-a cancel event shall return the two Euro coin and go back to the idle state. For the readability of Table <ref type="table" target="#tab_2">2</ref>, we omitted the cancel event transitions. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.2.">CppFSM</head><p>For creating finite state machines in C++, Philips IGT used the CppFSM framework. Listing 1 shows how to create a FSM in the CppFSM framework. It is a fragment of the state machine in Table <ref type="table" target="#tab_2">2</ref>. The "addTransition" method adds transitions to the FSM in the following way:</p><p>1. First parameter is the current state. A state enumeration is used, but not shown in the listing.</p><p>2. Second parameter is the next state. The same state enumeration is used.</p><p>3. Third parameter is the input event. An input enumeration is used, but not shown in the listing. 4. Fourth parameter is the output event. This is a reference to a method.</p><p>Observe that a transition can only trigger one output event. The resulting state machine is input enabled which means that any event is accepted in any state; when no transition specified for a certain input event in a certain state, then there will be no output event, but also no assert will be called. Note that a CppFSM program can be seen as a component which has a provided interface with the input events and a required interface with the output events.</p><p>Listing Listing 2 shows how the FSM is used. Transitions can be triggered by calling the "makeTransition" method. The current state can be queried for with the "getState" method. It returns the state enumeration value. An example of an output event is "displaySelectBeverage". This method is registered as a function pointer in Listing 1. On a transition, the CppFSM framework can invoke this method. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="3.3.">Dezyne</head><p>Dezyne<ref type="foot" target="#foot_0">1</ref> takes a component-based perspective on software. Every component typically has a provided interface and one or more required interfaces. There are two types of models:</p><p>• Interface model containing the signature and a behavioral protocol. The behavior protocol is written as a FSM which describes the allowed sequences of method calls. • Component model describing component behavior, including usage of interface models. This behavior is also written as a FSM which describes what needs to be done when method calls happen on the provided and required interfaces.</p><p>Dezyne implements a run-to-completion semantics. This means that a component does not accept new method calls on its provided interface until the current method call has returned. In addition a component that uses the provided interface is blocked until the method call on the required interface returns <ref type="bibr" target="#b31">[32]</ref>.</p><p>With the Dezyne tool, interface and component models can be formally verified. This verification uses the mCRL2 model checker <ref type="bibr" target="#b11">[12]</ref> which checks:</p><p>• Whether deadlock and livelock states are absent in interface and component models.</p><p>• Whether component models are deterministic. For interface models it is allowed to describe non-deterministic behavior. • Whether a component is a refinement -using the failures divergence relation <ref type="bibr" target="#b32">[33]</ref>-of its provided interface. • Whether a component does not violate the behavioral protocol of its required interfaces.</p><p>From a Dezyne model, a mCRL2 model and C++ code can be generated <ref type="bibr" target="#b33">[34]</ref>. Verum<ref type="foot" target="#foot_1">2</ref> , the company that implements the Dezyne tooling, guarantees that then the C++ code and the mCRL2 model are semantically equivalent <ref type="bibr" target="#b13">[14]</ref>.</p><p>Typically, one first verifies a Dezyne model and if all checks pass, C++ code can be generated. With bindings the generated C++ code can easily be integrated into handwritten C++ code.</p><p>mCRL2 is used in the background and is hidden from the typical user. However, the tool can also store the mCRL2 model for the user to allow inspection or advanced checks.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.">Approach Applied to Industrial Case</head><p>In this section, we describe how we refine our general approach to a number of steps that transform CppFSM code to Dezyne. This also include a refactoring of the manually written code that interfaces with CppFSM to code that interfaces with Dezyne generated code.</p><p>Figure <ref type="figure" target="#fig_3">3</ref> depicts our detailed transformation approach for the Philips IGT case. The left code file depicts the original situation before transformation. We distinguish three types of code in a single code file:</p><p>• At the bottom, CppFSM code that implements a finite state machine. • In the middle, code interfacing with the CppFSM code; it either calls FSM code or is called by the CppFSM code. • At the top, all other code. This code interacts with the interfacing code.</p><p>On the right, we depict the situation after the transformation where the CppFSM code is removed. There is a new code file which includes the code that is generated from a Dezyne model.</p><p>We have automated the refactoring using the following eight steps:</p><p>1. We use a static technique to parse the code file and extract the Abstract Syntax Tree (AST).</p><p>2. From the AST, the CppFSM part is used to generate a Dezyne model.</p><p>3. Generate a mCRL2 model from the Dezyne model. 4. Use a dynamic technique to learn the behavior of the CppFSM code. The output is a Dot file. Dot is a language to describe nodes, edges and graphs<ref type="foot" target="#foot_2">3</ref> . 5. Convert the Dot file to a mCRL2 model. 6. Compare both mCRL2 models using an equivalence checker.</p><p>When both models are different, fix the issue. Otherwise, continue with:</p><p>7. The Dezyne model is used to generate a new code file that contains the FSM. 8. We use the AST to refactor the code that interface with CppFSM to interface with the newly Dezyne generated code. The steps of our approach are explained in more detail in the subsequent sections. Section 4.1 describes the transformation from CppFSM to Dezyne. The learning setup of Steps 4 &amp; 5 is described in Section 4.2. The conversion of a learned model to a model that we can compare for equivalence is described in Section 4.3. Given two mCRL2 models, we describe Step 6 in which we compare the two models in Section 4.4. The last step to refactor the code that interfaces with CppFSM to make it use of the newly generated Dezyne C++ code is explained in Section 4.5. Listing 1 from the case description in Section 3 is the input for the Rascal script. The output is Listing 3 which shows the resulting Dezyne model of the vending machine's state machine. As explained in Section 2, the component model imports two interface models: one is the provided interface and the other one the required interface. The states are defined in the "State" enumeration. The "state" variable of type "State" is initialized to the "idle" state. Next we see blocks between curly brackets with a state guard. The model should be read as follows:</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.1.">From CppFSM to Dezyne</head><p>• If in the "idle" state "insertTwoEuroCoin" is called, then "displaySelectBeverage" is shown and the next state is "paid". • If in the "idle" state "cancel" is called, then it is accepted and the state remains "idle".</p><p>Note that the method "getState" returns the current state, but the method is not always needed. For this reason, we made the generation of this method optional. For this transformation, we used the Rascal code from Appendix A.  </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.2.">From CppFSM to Model Learning Setup</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.3.">From Dot to mCRL2</head><p>Model learning results in a model in the Dot language. To allow equivalence checking -as described in Section 2-we need an mCRL2 model. Hence, we need to convert the Dot model to an mCRL2 model, according to Figure <ref type="figure" target="#fig_3">3</ref> Step 5. Listing 4 is an example of a Dot model as produced by the learner when learning the vending machine. Observe that the states are numbered from "s0" to "s7". For example, line 5 of Listing 4 is a transition from state "s0" to state "s1". In the learning process, the state names are lost because they are not externally visible. </p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.4.">Equivalence Checking</head><p>In Figure <ref type="figure" target="#fig_3">3</ref> Step 6, there are two mCRL2 models; one acquired by a dynamic technique (AML) and one generated by a static technique (metaprogramming). In this step, we compare the behavior of the two models using mCRL2. If the equivalence check fails, the checker provides a counter example that leads to a discrepancy in the models. To resolve the issue, several aspects have to be investigated. One possibility is that the dynamic technique learned an incomplete model; then the counter example can be used to continue the learning process. An alternative is that one of the generators in the static approach is incorrect, for instance, because of a mismatch in the understanding of the semantics of the programming language. After resolving the discrepancy, the equivalence checker needs to be rerun on the updated model because there can be more than one discrepancy to resolve. If the equivalence check passes, the Dezyne tool can be utilized to generate new C++ code (Step 7).</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="4.5.">Refactor Interfacing C++ Code</head><p>Figure <ref type="figure" target="#fig_3">3</ref> Step 8 depicts the workflow for refactoring a code file. The code that interfaces with the CppFSM framework needs to be replaced by code that interfaces with Dezyne generated C++ code. Calls to the CppFSM framework need to be replaced by calls to Dezyne generated C++ code. Moreover, we have to create the bindings such that Dezyne generated code can invoke the manually written output event methods. In addition, the CppFSM itself is no longer needed, because we use Dezyne generated code, and needs to be removed from the code file.</p><p>Section 3 explained how CppFSM code needs to be used. In Listing 1 a vending machine FSM is shown. This code is no longer required. We replace it with bindings to output events (i.e. actions) which is required for connecting Dezyne generated code to manually written action methods. The new bindings are shown in Listing 5. In Listing 2, the "makeTransition" method and "insertTwoEuroCoin" input event is used to initiate a transition. This is replaced by "insertTwoEuroCoin" on the "iProvided" interface, see Listing 6. The Rascal script for the described refactoring is provided in Appendix E Listing 16.</p><p>Listing 6: Usage of Dezyne generated code in C++ 1 mDezyneComposition.iProvided.in.insertTwoEuroCoin();</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="5.">Results</head><p>We applied the described approach to CppFSM code from Philips IGT. To our surprise, we observed that in Step 6 the mCRL2 models were not equivalent. When inspecting the learned model with a Dot viewer, we immediately realized that there was a semantic difference between the learned model and the generated Dezyne model. The learned model was input enabled, i.e., in all states all input events are allowed while the generated Dezyne model was not input enabled. We discovered that there were two versions of CppFSM: one for testing and one for in-product code. The testing flavor asserts on input events in states that do not have an explicit transition defined by "makeTransition". The product flavor, which was used in the Philips code, is input-enabled and accepts all inputs in all states. Hence, we had to make the generated Dezyne model also input enabled. We did this by creating the "makeStateMachineInputEnabled" method, see Listing 8 in Appendix A. After adding this method in the Dezyne model generator, the equivalence check holds.</p><p>After resolving this issue, we have applied the described approach to 14 Philips IGT cases. Table <ref type="table" target="#tab_4">3</ref> depicts per case the number of states and transitions in both Dezyne generated and model learned mCRL2 models. In the table, we compare the mCRL2 models as introduced in Section 4. Using other models than the mCRL2 models, i.e., the Dezyne or Dot models would give different numbers for states and transitions. For comparison, we transform the mCRL2 models to Labelled Transition Systems (LTSs). In this way, the comparison only checks input/output relations. For all the refactored CppFSMs, the equivalence check holds which gave us a lot of confidence that refactoring was successful. Intuitively, one would expect that the equivalence check only holds when the number of states and transitions of the two models are equal. But in cases 3 and 4, we observed that the number of states and transitions is much lower in the dynamically learned model than in the statically obtained Dezyne model while the equivalence check holds. The reason is that the CppFSM did not have output events in these cases. This raises the question whether the Dezyne model can be simplified to fewer states and some transitions. When we investigated this further, we found out that in these two cases other code polls the "getState" method from Listing 2 to check the state of the FSM and makes different choices based on the returned state. To not break the manually written code, we added the possibility to generate a "getState" in the Dezyne model and we manually refactored the usage of the "getState" from CppFSM to the new Dezyne model variant in the interfacing code.</p><p>In some cases, "makeTransition" from Listing 2 was embedded in another method. This method got the event enumeration as a parameter value. Our automated refactoring presented in Section 4.5 did not work in this case. Also in this case, we manually made the required changes.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.">Concluding Remarks</head><p>In this paper, we propose an approach to refactor Finite State Machines (FSMs) using a combination of static and dynamic techniques. This involves utilizing metaprogramming to generate a new FSM implementation from a source file containing a legacy FSM implementation. To increase confidence in the preserved semantics, we employ learning methods and equivalence checking. In this section, we describe limitations of our approach such as pitfalls and scalability in Section 6.1. Next we discuss alternative approaches in Section 6.2. Finally, in Section 6.3 we describe some ideas for future work.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1.">Limitations</head><p>We refactored the C++ code that interfaces with CppFSM to interface with the code generated by Dezyne, but it is not included in the learned model. Consequently, this weakness requires reliance on existing regression test suites for verification of correctness. However, since we have automated the refactoring process for the interfacing code, our confidence in its correctness is higher than with manual alternatives.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1.1.">Pitfalls</head><p>The main pitfalls concern the application of AML in an industrial setting. For instance, Omar et al. <ref type="bibr" target="#b34">[35]</ref> have identified pitfalls while performing AML at Philips. Aslam <ref type="bibr" target="#b35">[36]</ref> applied AML at ASML. In their setup, the adapter and the SUL are placed in separate executables and the adapter connects to the SUL using a TCP/IP socket connection. This setup is suboptimal because it is very slow to send and receive messages over a TCP/IP stack, to let the Operating System (OS) stop and start an executable for a reset, and to reestablish the TCP/IP connection. To mitigate this performance issue, we run the adapter and SUL in a single process, as shown in Appendix B Listing 10.</p><p>Omar et al. have identified that adapters could be generated. By generating the adapter, there are fewer opportunities to learn faulty models due to issues with the learning setup compared to the manual creation of adapters. Aslam et al. created a generator for the learning setup and we have also automated this process as described in Section 4.2.</p><p>Both identified issues with scalability, which we address in the next section.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.1.2.">Scalability</head><p>State space explosion is a valid concern for both model learning and model checking <ref type="bibr" target="#b36">[37]</ref>. Because of the time required to query and reset the SUL, AML will suffer from state space explosion before equivalence checking runs into the state space explosion problem. Hence, as shown by Aslam, it might be the case that complex models cannot be learned in a reasonable amount of time due to the limited ability to capture far-output-distinction behavior. To find far-output-distinction behavior, long EQs are required that distinguish the hypothesized model from the SUL's behavior. For instance, if "input1" produces an "output1". However, after calling "input1" one hundred times it no longer produces "output1", but "output2" <ref type="bibr" target="#b35">[36]</ref>. By manual inspections of our CppFSMs before refactoring we know that such a pattern was not present in our industrial case.</p><p>In addition, we do not expect scalability issues with metaprogramming because creating an AST and perform functions using the AST is done in just a few seconds.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.2.">Alternative Approaches</head><p>In this paper, we employed metaprogramming as a static technique and AML as a dynamic technique. However, other alternatives are possible.</p><p>Instead of using metaprogramming, we could have utilized a Language WorkBench (LWB) to create a Domain Specific Language (DSL) <ref type="bibr" target="#b1">[2]</ref>. The DSL should be capable of parsing the "addTransition" method lines of Listing 1. The DSL can be employed to generate mCRL2 models. In fact, for this approach and the one used in the paper, the same mCRL2 model code generator could be reused. The only difference is in Step 8, as a DSL cannot refactor the C++ code file to use the generated C++ code with the Dezyne tool. Alternatively, manual refactoring can be performed.</p><p>An alternative dynamic approach is to execute the code using test cases. Typically, testing such FSMs will be done using unit testing. However, legacy code is characterized by limited code coverage of the tests <ref type="bibr" target="#b37">[38]</ref>. To mitigate this issue, techniques can be employed to improve existing unit test suites by applying, e.g., mutation testing <ref type="bibr" target="#b38">[39]</ref> or test amplification <ref type="bibr" target="#b39">[40]</ref>. Downside of these techniques is that most implementations only support Java and not C++ which is our target language. The benefit of using AML is that it is programming language agnostic.</p></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head n="6.3.">Future Work</head><p>For this case, we manually checked that far-output-distinction behavior did not occur. Alternatively, we could have automated this check using a small metaprogram with, i.e., Rascal. Or we could have used a code coverage tool to check if all code is executed by AML.</p><p>There is a limitation where the refactored interfacing code is not learned due to its separation from the FSM implementation. For the correctness of this refactoring, we relied on the existing regression test suites. In the future, we want to investigate if we could include this code in the learned model.</p></div><figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_0"><head>Figure 1 :</head><label>1</label><figDesc>Figure 1: Active Model Learning</figDesc><graphic coords="2,195.34,143.32,204.60,111.60" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_1"><head>Figure 2 :</head><label>2</label><figDesc>Figure 2: Overview of the combined approach</figDesc><graphic coords="2,120.64,554.51,354.00,124.00" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_2"><head>Listing 2 :</head><label>2</label><figDesc>Usage of FSM in C++ mFsm.makeTransition(FsmEvent::insertTwoEuroCoin); mFsm.getState(); void Fsm::displaySelectBeverage() { // Implementation to display select beverage. }</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_3"><head>Figure 3 :</head><label>3</label><figDesc>Figure 3: Combining static and dynamic techniques for refactoring CppFSMs</figDesc><graphic coords="7,90.14,65.61,415.00,221.50" type="bitmap" /></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_4"><head>Figure 3</head><label>3</label><figDesc>Figure 3 Steps 1, 2 &amp; 7 depict the workflow that we follow to get from a CppFSM in C++ to a new C++ implementation generated by Dezyne. We use ClaiR, the C++ front end of Rascal to parse the C++ file with CppFSM.Listing 1 from the case description in Section 3 is the input for the Rascal script. The output is Listing 3 which shows the resulting Dezyne model of the vending machine's state machine. As explained in Section 2, the component model imports two interface models: one is the provided interface and the other one the required interface. The states are defined in the "State" enumeration. The "state" variable of type "State" is initialized to the "idle" state. Next we see blocks between curly brackets with a state guard. The model should be read as follows:</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_5"><head>Figure 3</head><label>3</label><figDesc>Figure3Steps 4 &amp; 5 depict the workflow that we follow to get from a CppFSM in C++ to a new mCRL2 model. Rascal is used to automatically generate a setup such that the behavior of the SUL can be learned. AML is utilized to acquire a Dot model and Rascal is used to transform the Dot model into a mCRL2 model. In Appenix B Listing 10, we show the generated learning setup in C++ code. When compiled, this code results in a console application. Standard input and output are used to connect the console application to the learner. The Rascal code in Appendix C Listing 11 prints the contents of the console application. This includes the SUL and the adapter. Listing 12 is used to generate the batch file to call the model learner with the right SUL and its input events (i.e. the input alphabet).</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_6"><head>Listing 4 :</head><label>4</label><figDesc>Vending machine in Dot digraph g { s0 [shape = "circle" label="s0"]; ... s7 [shape = "circle" label="s0"]; s0 -&gt; s1 [label="insertTwoEuroCoin / displaySelectBeverage"]; s0 -&gt; s0 [label="cancel / self"]; s0 -&gt; s0 [label="selectCoffee / self"]; s0 -&gt; s0 [label="selectMilk / self"]; s0 -&gt; s0 [label="selectSugar / self"]; s0 -&gt; s0 [label="confirmSelection / self"]; ... s4 -&gt; s4 [label="insertTwoEuroCoin / returnCoin"]; s4 -&gt; s0 [label="cancel / returnCoin"]; s4 -&gt; s4 [label="selectCoffee / self"]; s4 -&gt; s6 [label="selectMilk / diplayMilkSelected"]; s4 -&gt; s5 [label="selectSugar / diplaySugarSelected"]; s4 -&gt; s0 [label="confirmSelection / makeCoffee"]; ... __start0 [label="" shape="none" width="0" height="0"]; __start0 -&gt; s0; } Appendix D Listing 13 presents the result of translating a Dot model into an mCRL2 model. Listing 14 shows the Rascal script that performs the translation. Listing 15 also shows the Dot grammar in Rascal used by the script.</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" xml:id="fig_7"><head>Listing 5 :</head><label>5</label><figDesc>Vending machine bindings for Dezyne in C++ void createVendingFsm() { mDezyneComposition.iRequired.in.displaySelectBeverage = std::bind(&amp;Fsm::displaySelectBeverage, this); mDezyneComposition.iRequired.in.returnCoin = std::bind(&amp;Fsm::returnCoin, this); ... mDezyneComposition.iRequired.in.displaySugarSelected = std::bind(&amp;Fsm::displaySugarSelected, this); }</figDesc></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_2"><head>Table 2</head><label>2</label><figDesc>State machine of the vending machine example</figDesc><table><row><cell>Current state</cell><cell>Input event</cell><cell>Output event</cell><cell>Next state</cell></row><row><cell>idle</cell><cell cols="3">insertTwoEuroCoin displaySelectBeverage paid</cell></row><row><cell>paid</cell><cell>coffee</cell><cell cols="2">displayCoffeeSelected coffee</cell></row><row><cell>coffee</cell><cell>confirmSelection</cell><cell>MakeCoffee</cell><cell>idle</cell></row><row><cell>paid</cell><cell cols="2">insertTwoEuroCoin returnCoin</cell><cell>paid</cell></row><row><cell>coffee</cell><cell>selectSugar</cell><cell>displaySugarSelected</cell><cell>coffeeWithSugar</cell></row><row><cell>coffee</cell><cell>selectMilk</cell><cell>displayMilkSelected</cell><cell>coffeeWithMilk</cell></row><row><cell>coffeeWithSugar</cell><cell>confirmSelection</cell><cell>MakeCoffee</cell><cell>idle</cell></row><row><cell>coffeeWithSugar</cell><cell>selectMilk</cell><cell>displayMilkSelected</cell><cell>coffeeWithMilkAndSugar</cell></row><row><cell>coffeeWithMilk</cell><cell>confirmSelection</cell><cell>MakeCoffee</cell><cell>idle</cell></row><row><cell>coffeeWithMilk</cell><cell>selectSugar</cell><cell>displaySugarSelected</cell><cell>coffeeWithMilkAndSugar</cell></row><row><cell cols="2">coffeeWithMilkAndSugar confirmSelection</cell><cell>MakeCoffee</cell><cell>idle</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_3"><head></head><label></label><figDesc>1: Vending machine FSM in C++</figDesc><table><row><cell>void createVendingFsm()</cell></row><row><cell>{</cell></row><row><cell>mFsm.addTransition(idle,paid,insertTwoEuroCoin,&amp;Fsm::displaySelectBeverage);</cell></row><row><cell>mFsm.addTransition(paid,paid,insertTwoEuroCoin,&amp;Fsm::returnCoin);</cell></row><row><cell>mFsm.addTransition(paid,idle,cancel,&amp;Fsm::returnCoin);</cell></row><row><cell>mFsm.addTransition(paid,coffee,selectCoffee,&amp;Fsm::displayCoffeeSelected);</cell></row><row><cell>...</cell></row><row><cell>mFsm.addTransition(coffee,coffee,insertTwoEuroCoin,&amp;Fsm::returnCoin);</cell></row><row><cell>mFsm.addTransition(coffee,idle,cancel,&amp;Fsm::returnCoin);</cell></row><row><cell>mFsm.addTransition(coffee,coffeeWithMilk,selectMilk,&amp;Fsm::displayMilkSelected);</cell></row><row><cell>mFsm.addTransition(coffee,coffeeWithSugar,selectSugar,&amp;Fsm::displaySugarSelected);</cell></row><row><cell>...</cell></row><row><cell>}</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_4"><head>Listing 3 :</head><label>3</label><figDesc>Component model of vending machine in Dezyne</figDesc><table><row><cell>import IVendingProvided.dzn;</cell></row><row><cell>import IVendingRequired.dzn;</cell></row><row><cell>component ExampleFSM {</cell></row><row><cell>provides IVendingProvided iProvided;</cell></row><row><cell>requires IVendingRequired iRequired;</cell></row><row><cell>behaviour {</cell></row><row><cell>enum State {idle,paid,coffee,coffeeWithSugar, coffeeWithMilk,coffeeWithMilkAndSugar};</cell></row><row><cell>State state = State.idle;</cell></row><row><cell>[state.idle] {</cell></row><row><cell>on iProvided.insertTwoEuroCoin():{iRequired.displaySelectBeverage(); state = State.paid;}</cell></row><row><cell>on iProvided.cancel(): ;</cell></row><row><cell>on iProvided.selectCoffee(): ;</cell></row><row><cell>on iProvided.selectMilk(): ;</cell></row><row><cell>on iProvided.selectSugar(): ;</cell></row><row><cell>on iProvided.confirmSelection(): ;</cell></row><row><cell>on iProvided.getState(): reply(IProvided.State.idle);</cell></row><row><cell>}</cell></row><row><cell>...</cell></row><row><cell>[state.coffee] {</cell></row><row><cell>on iProvided.insertTwoEuroCoin():{iRequired.returnCoin(); state = State.coffee;}</cell></row><row><cell>...</cell></row><row><cell>on iProvided.getState(): reply(IProvided.State.coffee);</cell></row><row><cell>}</cell></row><row><cell>...</cell></row><row><cell>}</cell></row><row><cell>}</cell></row></table></figure>
<figure xmlns="http://www.tei-c.org/ns/1.0" type="table" xml:id="tab_5"><head>Table 3</head><label>3</label><figDesc>Comparison of statically and dynamically acquired mCRL2 models</figDesc><table><row><cell></cell><cell cols="4">Statically obtained models Dynamically acquired models</cell></row><row><cell cols="2">Case # States</cell><cell># Transitions</cell><cell># States</cell><cell># Transitions</cell></row><row><cell>1</cell><cell>63</cell><cell>153</cell><cell>63</cell><cell>153</cell></row><row><cell>2</cell><cell>88</cell><cell>376</cell><cell>88</cell><cell>376</cell></row><row><cell>3</cell><cell>42</cell><cell>70</cell><cell>6</cell><cell>10</cell></row><row><cell>4</cell><cell>84</cell><cell>182</cell><cell>79</cell><cell>170</cell></row><row><cell>5</cell><cell>27</cell><cell>47</cell><cell>27</cell><cell>47</cell></row><row><cell>6</cell><cell>56</cell><cell>147</cell><cell>56</cell><cell>147</cell></row><row><cell>7</cell><cell>32</cell><cell>62</cell><cell>32</cell><cell>62</cell></row><row><cell>8</cell><cell>69</cell><cell>219</cell><cell>69</cell><cell>219</cell></row><row><cell>9</cell><cell>13</cell><cell>17</cell><cell>13</cell><cell>17</cell></row><row><cell>10</cell><cell>67</cell><cell>166</cell><cell>67</cell><cell>166</cell></row><row><cell>11</cell><cell>43</cell><cell>85</cell><cell>43</cell><cell>85</cell></row><row><cell>12</cell><cell>19</cell><cell>28</cell><cell>19</cell><cell>28</cell></row><row><cell>13</cell><cell>25</cell><cell>37</cell><cell>25</cell><cell>37</cell></row><row><cell>14</cell><cell>24</cell><cell>36</cell><cell>24</cell><cell>36</cell></row></table></figure>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="1" xml:id="foot_0">https://gitlab.com/dezyne</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="2" xml:id="foot_1">https://www.verum.com/DiscoverDezyne</note>
			<note xmlns="http://www.tei-c.org/ns/1.0" place="foot" n="3" xml:id="foot_2">https://graphviz.org/doc/info/lang.html</note>
		</body>
		<back>
			<div type="annex">
<div xmlns="http://www.tei-c.org/ns/1.0"><head>A. From CppFSM To Dezyne</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>C. From CppFSM To Model Learning Setup</head></div>
<div xmlns="http://www.tei-c.org/ns/1.0"><head>D. From Dot To mCRL2</head><p>Listing 13: Vending machine in mCRL2  start syntax Build = build: "digraph" "g" "{" State+ states Transition+ transitions Footer footer"}"; syntax State = state: Id name "[" "shape" "=" "\"circle\"" "label" "=" "\"" Id text "\"" "];"; syntax Transition = transition: Id curState "-\&gt;" Id nextState "[" "label" "=" "\"" Id event "/" Id call "\"];"; syntax Footer = footer: "__start0" "[" "label" "=" "\"\"" "shape" "=" "\"none\"" "width" "=" "\"0\"" "height" "=" "\"0\"" "];" "__start0" "-\&gt;" "s0;"; lexical Id = ( </p></div>			</div>
			<div type="references">

				<listBibl>

<biblStruct xml:id="b0">
	<monogr>
		<author>
			<persName><forename type="first">H</forename><surname>Vliet</surname></persName>
		</author>
		<title level="m">Software engineering: principles and practice</title>
				<meeting><address><addrLine>Hoboken, NJ</addrLine></address></meeting>
		<imprint>
			<publisher>John Wiley &amp; Sons</publisher>
			<date type="published" when="2008">2008</date>
			<biblScope unit="volume">13</biblScope>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b1">
	<monogr>
		<title level="m" type="main">Domain-specific languages</title>
		<author>
			<persName><forename type="first">M</forename><surname>Fowler</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2010">2010</date>
			<publisher>Pearson Education</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b2">
	<analytic>
		<title level="a" type="main">RASCAL: A domain specific language for source code analysis and manipulation</title>
		<author>
			<persName><forename type="first">P</forename><surname>Klint</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Van Der Storm</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Vinju</surname></persName>
		</author>
		<idno type="DOI">10.1109/SCAM.2009.28</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2009 Ninth IEEE International Working Conference on Source Code Analysis and Manipulation</title>
				<meeting>the 2009 Ninth IEEE International Working Conference on Source Code Analysis and Manipulation</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2009">2009</date>
			<biblScope unit="page" from="168" to="177" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b3">
	<analytic>
		<title level="a" type="main">Reverse engineering of object oriented code</title>
		<author>
			<persName><forename type="first">P</forename><surname>Tonella</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings. 27th International Conference on Software Engineering</title>
				<meeting>27th International Conference on Software Engineering</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2005">2005. 2005</date>
			<biblScope unit="page" from="724" to="725" />
		</imprint>
	</monogr>
	<note>ICSE 2005</note>
</biblStruct>

<biblStruct xml:id="b4">
	<analytic>
		<title level="a" type="main">A comparison of statecharts variants</title>
		<author>
			<persName><forename type="first">M</forename><surname>Von</surname></persName>
		</author>
		<author>
			<persName><surname>Beeck</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Formal Techniques in Real-Time and Fault-Tolerant Systems: Third International Symposium Organized Jointly with the Working Group Provably Correct Systems-ProCoS</title>
				<meeting><address><addrLine>Lübeck, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>Citeseer</publisher>
			<date type="published" when="1994">September 19-23, 1994. 1994</date>
			<biblScope unit="page" from="128" to="148" />
		</imprint>
	</monogr>
	<note>Proceedings 3</note>
</biblStruct>

<biblStruct xml:id="b5">
	<analytic>
		<title level="a" type="main">Model learning</title>
		<author>
			<persName><forename type="first">F</forename><surname>Vaandrager</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">60</biblScope>
			<biblScope unit="page" from="86" to="95" />
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b6">
	<analytic>
		<title level="a" type="main">Learning regular sets from queries and counterexamples</title>
		<author>
			<persName><forename type="first">D</forename><surname>Angluin</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Information and computation</title>
		<imprint>
			<biblScope unit="volume">75</biblScope>
			<biblScope unit="page" from="87" to="106" />
			<date type="published" when="1987">1987</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b7">
	<analytic>
		<title level="a" type="main">The TTT algorithm: a redundancy-free approach to active automata learning</title>
		<author>
			<persName><forename type="first">M</forename><surname>Isberner</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Howar</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Steffen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Runtime Verification: 5th International Conference, RV 2014</title>
				<meeting><address><addrLine>Toronto, ON, Canada</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2014">September 22-25, 2014. 2014</date>
			<biblScope unit="page" from="307" to="322" />
		</imprint>
	</monogr>
	<note>Proceedings 5</note>
</biblStruct>

<biblStruct xml:id="b8">
	<analytic>
		<title level="a" type="main">A new approach for active automata learning based on apartness</title>
		<author>
			<persName><forename type="first">F</forename><surname>Vaandrager</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Garhewal</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Rot</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Wißmann</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Conference on Tools and Algorithms for the Construction and Analysis of Systems</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2022">2022</date>
			<biblScope unit="page" from="223" to="243" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b9">
	<analytic>
		<title level="a" type="main">Test selection based on finite state models</title>
		<author>
			<persName><forename type="first">F</forename><forename type="middle">B</forename><surname>Khendek</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Fujiwara</surname></persName>
		</author>
		<author>
			<persName><forename type="first">G</forename><surname>Bochmann</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Khendek</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Amalou</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Ghedamsi</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">IEEE Transactions on software engineering</title>
		<imprint>
			<biblScope unit="volume">17</biblScope>
			<biblScope unit="page" from="10" to="1109" />
			<date type="published" when="1991">1991</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b10">
	<analytic>
		<title level="a" type="main">State identification sequences from the splitting tree</title>
		<author>
			<persName><forename type="first">M</forename><surname>Soucha</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Bogdanov</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Information and Software Technology</title>
		<imprint>
			<biblScope unit="volume">123</biblScope>
			<biblScope unit="page">106297</biblScope>
			<date type="published" when="2020">2020</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b11">
	<monogr>
		<title level="m" type="main">Modelling and analysis of communicating systems</title>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">F</forename><surname>Groote</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Mousavi</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2014">2014</date>
			<publisher>MIT press</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b12">
	<analytic>
		<title level="a" type="main">Determinancy→(observation equivalence= trace equivalence)</title>
		<author>
			<persName><forename type="first">J</forename><surname>Engelfriet</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Theoretical Computer Science</title>
		<imprint>
			<biblScope unit="volume">36</biblScope>
			<biblScope unit="page" from="21" to="25" />
			<date type="published" when="1985">1985</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b13">
	<monogr>
		<author>
			<persName><forename type="first">R</forename><surname>Van Beusekom</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>De Jonge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Hoogendijk</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Nieuwenhuizen</surname></persName>
		</author>
		<idno type="arXiv">arXiv:2108.02962</idno>
		<title level="m">Dezyne: Paving the way to practical formal software engineering</title>
				<imprint>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
	<note type="report_type">arXiv preprint</note>
</biblStruct>

<biblStruct xml:id="b14">
	<monogr>
		<title level="m" type="main">Refactoring: improving the design of existing code</title>
		<author>
			<persName><forename type="first">M</forename><surname>Fowler</surname></persName>
		</author>
		<imprint>
			<date type="published" when="2018">2018</date>
			<publisher>Addison-Wesley Professional</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b15">
	<analytic>
		<title level="a" type="main">Next generation automated software evolution refactoring at scale</title>
		<author>
			<persName><forename type="first">J</forename><surname>Ivers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">I</forename><surname>Ozkaya</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Nord</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Seifried</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 28th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering</title>
				<meeting>the 28th ACM Joint Meeting on European Software Engineering Conference and Symposium on the Foundations of Software Engineering</meeting>
		<imprint>
			<date type="published" when="2020">2020</date>
			<biblScope unit="page" from="1521" to="1524" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b16">
	<analytic>
		<title level="a" type="main">In defense of soundiness: A manifesto</title>
		<author>
			<persName><forename type="first">B</forename><surname>Livshits</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Sridharan</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Smaragdakis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Lhoták</surname></persName>
		</author>
		<author>
			<persName><forename type="first">N</forename><surname>Amaral</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><forename type="middle">Y</forename><surname>Chang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Guyer</surname></persName>
		</author>
		<author>
			<persName><forename type="first">U</forename><surname>Khedker</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Møller</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Vardoulakis</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Communications of the ACM</title>
		<imprint>
			<biblScope unit="volume">58</biblScope>
			<biblScope unit="page" from="44" to="46" />
			<date type="published" when="2015">2015</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b17">
	<analytic>
		<title level="a" type="main">The asf+sdf meta-environment: A component-based language development environment</title>
		<author>
			<persName><forename type="first">M</forename><surname>Van Den Brand</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Van Deursen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Heering</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><forename type="middle">De</forename><surname>Jong</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>De Jonge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Kuipers</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Klint</surname></persName>
		</author>
		<author>
			<persName><forename type="first">L</forename><surname>Moonen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Olivier</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Scheerder</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Vinju</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Visser</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Visser</surname></persName>
		</author>
		<idno type="DOI">10.1016/S1571-0661(04)80917-4</idno>
	</analytic>
	<monogr>
		<title level="j">Electron. Notes Theor. Comput. Sci</title>
		<imprint>
			<biblScope unit="volume">44</biblScope>
			<biblScope unit="page" from="3" to="8" />
			<date type="published" when="2001">2001</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b18">
	<analytic>
		<title level="a" type="main">Program transformation with Stratego/XT</title>
		<author>
			<persName><forename type="first">E</forename><surname>Visser</surname></persName>
		</author>
		<idno type="DOI">10.1007/978-3-540-25935-0_13</idno>
	</analytic>
	<monogr>
		<title level="m">Domain-Specific Program Generation: International Seminar</title>
				<editor>
			<persName><forename type="first">C</forename><surname>Lengauer</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">D</forename><surname>Batory</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">C</forename><surname>Consel</surname></persName>
		</editor>
		<editor>
			<persName><forename type="first">M</forename><surname>Odersky</surname></persName>
		</editor>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page" from="216" to="238" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b19">
	<analytic>
		<title level="a" type="main">Source transformation in software engineering using the TXL transformation system</title>
		<author>
			<persName><forename type="first">J</forename><surname>Cordy</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><surname>Dean</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Malton</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Schneider</surname></persName>
		</author>
		<idno type="DOI">10.1016/S0950-5849(02)00104-0</idno>
	</analytic>
	<monogr>
		<title level="j">Inf. Softw. Technol</title>
		<imprint>
			<biblScope unit="volume">44</biblScope>
			<biblScope unit="page" from="827" to="837" />
			<date type="published" when="2002">2002</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b20">
	<analytic>
		<title level="a" type="main">Design of the CodeBoost transformation system for domain-specific optimisation of C++ programs</title>
		<author>
			<persName><forename type="first">O</forename><surname>Bagge</surname></persName>
		</author>
		<author>
			<persName><forename type="first">K</forename><surname>Kalleberg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Haveraaen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">E</forename><surname>Visser</surname></persName>
		</author>
		<idno type="DOI">10.1109/SCAM.2003.1238032</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the Third IEEE International Workshop on Source Code Analysis and Manipulation</title>
				<meeting>the Third IEEE International Workshop on Source Code Analysis and Manipulation</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2003">2003</date>
			<biblScope unit="page" from="65" to="74" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b21">
	<analytic>
		<title level="a" type="main">DMS ® : program transformations for practical scalable software evolution</title>
		<author>
			<persName><forename type="first">I</forename><surname>Baxter</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Pidgeon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Mehlich</surname></persName>
		</author>
		<idno type="DOI">10.1109/ICSE.2004.1317484</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 26th International Conference on Software Engineering</title>
				<meeting>the 26th International Conference on Software Engineering</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2004">2004</date>
			<biblScope unit="page" from="625" to="634" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b22">
	<analytic>
		<title level="a" type="main">High-fidelity C/C++ code transformation</title>
		<author>
			<persName><forename type="first">D</forename><surname>Waddington</surname></persName>
		</author>
		<author>
			<persName><forename type="first">B</forename><surname>Yao</surname></persName>
		</author>
		<idno type="DOI">10.1016/j.entcs.2005.04.037</idno>
	</analytic>
	<monogr>
		<title level="j">Electron. Notes Theor. Comput. Sci</title>
		<imprint>
			<biblScope unit="volume">141</biblScope>
			<biblScope unit="page" from="35" to="56" />
			<date type="published" when="2005">2005</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b23">
	<analytic>
		<title level="a" type="main">Large-scale automated refactoring using ClangMR</title>
		<author>
			<persName><forename type="first">H</forename><surname>Wright</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Jasper</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Klimek</surname></persName>
		</author>
		<author>
			<persName><forename type="first">C</forename><surname>Carruth</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Z</forename><surname>Wan</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2013 IEEE International Conference on Software Maintenance</title>
				<meeting>the 2013 IEEE International Conference on Software Maintenance</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2013">2013</date>
			<biblScope unit="page" from="548" to="551" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b24">
	<analytic>
		<title level="a" type="main">Reducing code complexity through code refactoring and model-based rejuvenation</title>
		<author>
			<persName><forename type="first">A</forename><surname>Mooij</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Ketema</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Klusener</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
		<idno type="DOI">10.1109/SANER48275.2020.9054823</idno>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2020 IEEE 27th International Conference on Software Analysis, Evolution and Reengineering</title>
				<meeting>the 2020 IEEE 27th International Conference on Software Analysis, Evolution and Reengineering</meeting>
		<imprint>
			<publisher>IEEE</publisher>
			<date type="published" when="2020">2020</date>
			<biblScope unit="page" from="617" to="621" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b25">
	<analytic>
		<title level="a" type="main">Large-scale semi-automated migration of legacy C/C++ test code</title>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Aarssen</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Tielemans</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Vinju</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Software: Practice and Experience</title>
		<imprint>
			<biblScope unit="volume">52</biblScope>
			<biblScope unit="page" from="1543" to="1580" />
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b26">
	<analytic>
		<title/>
		<author>
			<persName><forename type="first">R</forename><surname>Aarssen</surname></persName>
		</author>
		<idno type="DOI">10.5281/zenodo.891122</idno>
	</analytic>
	<monogr>
		<title level="j">cwi-swat/clair</title>
		<imprint>
			<biblScope unit="volume">1</biblScope>
			<biblScope unit="issue">0</biblScope>
			<date type="published" when="2017">2017</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b27">
	<analytic>
		<title level="a" type="main">Model learning: a survey of foundations, tools and applications</title>
		<author>
			<persName><forename type="first">S</forename><surname>Ali</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Sun</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Zhao</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Frontiers of Computer Science</title>
		<imprint>
			<biblScope unit="volume">15</biblScope>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b28">
	<analytic>
		<title level="a" type="main">Applying automata learning to embedded control software</title>
		<author>
			<persName><forename type="first">W</forename><surname>Smeenk</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Moerman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Vaandrager</surname></persName>
		</author>
		<author>
			<persName><forename type="first">D</forename><surname>Jansen</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Conference on Formal Engineering Methods</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2015">2015</date>
			<biblScope unit="page" from="67" to="83" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b29">
	<analytic>
		<title level="a" type="main">Refactoring of legacy software using model learning and equivalence checking: an industrial experience report</title>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Hooman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">F</forename><surname>Vaandrager</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Conference on Integrated Formal Methods</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2016">2016</date>
			<biblScope unit="page" from="311" to="325" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b30">
	<analytic>
		<title level="a" type="main">Industrial experience with the migration of legacy models using a DSL</title>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Hooman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Tielemans</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the Real World Domain Specific Languages Workshop 2018</title>
				<meeting>the Real World Domain Specific Languages Workshop 2018</meeting>
		<imprint>
			<date type="published" when="2018">2018</date>
			<biblScope unit="page" from="1" to="10" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b31">
	<analytic>
		<title level="a" type="main">Experiences with a compositional model checker in the healthcare domain</title>
		<author>
			<persName><forename type="first">J</forename><surname>Hooman</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Huis In't Veld</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Symposium on Foundations of Health Informatics Engineering and Systems</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2011">2011</date>
			<biblScope unit="page" from="93" to="110" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b32">
	<analytic>
		<title level="a" type="main">FDR3-a modern refinement checker for CSP</title>
		<author>
			<persName><forename type="first">T</forename><surname>Gibson-Robinson</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Armstrong</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Boulgakov</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><forename type="middle">W</forename><surname>Roscoe</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">International Conference on Tools and Algorithms for the Construction and Analysis of Systems</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2014">2014</date>
			<biblScope unit="page" from="187" to="201" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b33">
	<analytic>
		<title level="a" type="main">Formalising the dezyne modelling language in mCRL2</title>
		<author>
			<persName><forename type="first">R</forename><forename type="middle">V</forename><surname>Beusekom</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">F</forename><surname>Groote</surname></persName>
		</author>
		<author>
			<persName><forename type="first">P</forename><surname>Hoogendijk</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Howe</surname></persName>
		</author>
		<author>
			<persName><forename type="first">W</forename><surname>Wesselink</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Wieringa</surname></persName>
		</author>
		<author>
			<persName><forename type="first">T</forename><forename type="middle">A</forename><surname>Willemse</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Critical Systems: Formal Methods and Automated Verification</title>
				<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2017">2017</date>
			<biblScope unit="page" from="217" to="233" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b34">
	<analytic>
		<title level="a" type="main">Pitfalls in applying model learning to industrial legacy software</title>
		<author>
			<persName><forename type="first">O</forename><surname>Duhaiby</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Mooij</surname></persName>
		</author>
		<author>
			<persName><forename type="first">H</forename><surname>Van Wezep</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><forename type="middle">F</forename><surname>Groote</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Leveraging Applications of Formal Methods, Verification and Validation</title>
				<meeting><address><addrLine>Limassol, Cyprus</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2018">November 5-9, 2018. 2018</date>
			<biblScope unit="volume">8</biblScope>
			<biblScope unit="page" from="121" to="138" />
		</imprint>
	</monogr>
	<note>Proceedings, Part IV</note>
</biblStruct>

<biblStruct xml:id="b35">
	<monogr>
		<title level="m" type="main">Deriving behavioral specifications of industrial software components</title>
		<author>
			<persName><forename type="first">K</forename><surname>Aslam</surname></persName>
		</author>
		<idno>TU/e</idno>
		<imprint>
			<date type="published" when="2021">2021</date>
		</imprint>
	</monogr>
	<note type="report_type">PhD thesis</note>
</biblStruct>

<biblStruct xml:id="b36">
	<analytic>
		<title level="a" type="main">Towards an industrial stateful software rejuvenation toolchain using model learning</title>
		<author>
			<persName><forename type="first">M</forename><surname>Schuts</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Hooman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">Proceedings of the 2023 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software</title>
				<meeting>the 2023 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software</meeting>
		<imprint>
			<date type="published" when="2023">2023</date>
			<biblScope unit="page" from="15" to="31" />
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b37">
	<analytic>
		<title level="a" type="main">Generating test suites to validate legacy systems</title>
		<author>
			<persName><forename type="first">T</forename><surname>Weigert</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Kolchin</surname></persName>
		</author>
		<author>
			<persName><forename type="first">S</forename><surname>Potiyenko</surname></persName>
		</author>
		<author>
			<persName><forename type="first">O</forename><surname>Gurenko</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Van Den Berg</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Banas</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Chetvertak</surname></persName>
		</author>
		<author>
			<persName><forename type="first">R</forename><surname>Yagodka</surname></persName>
		</author>
		<author>
			<persName><forename type="first">V</forename><surname>Volkov</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="m">System Analysis and Modeling. Languages, Methods, and Tools for Industry 4.0: 11th International Conference, SAM 2019</title>
				<meeting><address><addrLine>Munich, Germany</addrLine></address></meeting>
		<imprint>
			<publisher>Springer</publisher>
			<date type="published" when="2019">September 16-17, 2019. 2019</date>
			<biblScope unit="page" from="3" to="23" />
		</imprint>
	</monogr>
	<note>Proceedings 11</note>
</biblStruct>

<biblStruct xml:id="b38">
	<analytic>
		<title level="a" type="main">Mutation testing advances: an analysis and survey</title>
		<author>
			<persName><forename type="first">M</forename><surname>Papadakis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Kintis</surname></persName>
		</author>
		<author>
			<persName><forename type="first">J</forename><surname>Zhang</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Jia</surname></persName>
		</author>
		<author>
			<persName><forename type="first">Y</forename><surname>Le Traon</surname></persName>
		</author>
		<author>
			<persName><forename type="first">M</forename><surname>Harman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Advances in computers</title>
		<imprint>
			<biblScope unit="volume">112</biblScope>
			<biblScope unit="page" from="275" to="378" />
			<date type="published" when="2019">2019</date>
			<publisher>Elsevier</publisher>
		</imprint>
	</monogr>
</biblStruct>

<biblStruct xml:id="b39">
	<analytic>
		<title level="a" type="main">Developer-centric test amplification: The interplay between automatic generation human exploration</title>
		<author>
			<persName><forename type="first">C</forename><surname>Brandt</surname></persName>
		</author>
		<author>
			<persName><forename type="first">A</forename><surname>Zaidman</surname></persName>
		</author>
	</analytic>
	<monogr>
		<title level="j">Empirical Software Engineering</title>
		<imprint>
			<biblScope unit="volume">27</biblScope>
			<date type="published" when="2022">2022</date>
		</imprint>
	</monogr>
</biblStruct>

				</listBibl>
			</div>
		</back>
	</text>
</TEI>
