# Research Project Outline
## (0) Abstract
- Background
- Research questions
- Existing contribution/literature (but preferably without the need of references)
- Main conclusions
<br>
## (1) Introduction
- General introduction of the topic (with how it is related to test generation)
- Motivation on the importance of the topic (what we want to achieve) and why we need to research this
- Introduce related work and literature and what is still missing/unanswered
- Introduction of the related research question that we want to investigate
<br>
According to Reyes, there are three overarching goals of a good introduction:
1. Ensure that you summarize prior studies about the topic in a manner that lays a foundation for understanding the research problem
2. Explain how your study specifically addresses gaps in the literature, insufficient consideration of the topic, or other deficiency in the literature
3. Note the broader theoretical, empirical, and/or policy contributions and implications of your research.
<br>
## (2) The Basic Interpreter
- Introduction of a basic interpreter with the pattern matching feature
### (2.1) Definition of Expressions
- Enumeration of the **`Expr`** case classes and explain the purpose of each expression case class:
- Elaborate explanation of the **`Val`** case class (value constructor) with example
- Explanation of how to do pattern matching with **`Pattern`** instances
### (2.2) Evaluation Strategy
- Explanation of interpretation with an _environment_
- Lazy evaluation → _Thunks_ → How to implement this the simple (but impure) way and the _functionally pure_ way → reference
- Necessary **`Value`** case classes in order to achieve this
### (2.3) Implementing the Interpreter
- Introduce signature of the **`Interpreter.interp`** method:
```language=Scala
def interp(expr: Expr, env: Environment): Value
```
- Introduce **`Environment`** case class
- Interpretation of **`ThunkV`** instances → **`force`** method
- Interpretation of the **`Expr`** case classes, with emphasis on:
- **`Letrec`** expressions
- **`Apply`** expressions
- **`Match`** expressions → explain the **`doMatch`** method
- Full code in Appendix
- Example program implementing the **`append`** method in Appendix.
### (2.4) Transforming into a Test Data Generator
- Explanation of symbolic execution / concolic testing (and why we need this)
- Transformation into an abstract interpreter → in order to gain information about its semantics (without performing all the calculations)
- State that the technical details will be discussed further in the next section
<br>
## (3) Transformation into a Symbolic Executor
- Brief explanation of what will be discussed in this section
### (3.1) Free Monads
- What are Free monads → and why do we need them
- Implementation of a standalone Free monads
- Advantages of Free monads (→ flexibility, ability to construct command trees)
### (3.2) Translation of Expressions into Commands
- Why do we need to translate these expressions
- What commands do we need to add in order to be able to generate test data
- Introduction to Logic Expressions (**`LogicExpr`**), e.g. meta variables
### (3.3) Evaluation into a Command Tree
- How to evaluate a command into a command tree (**`Free[Cmd, A]`**)
- Why we need to evaluate this into a command tree (→ for symbolic analysis)
- What is different in comparison with the basic interpreter (e.g. **`Match`** expressions)
- How to handle these different commands (e.g. pattern matching)
### (3.4) Interpreting the Command Tree
- How to interpret these commands (Free monads)
- Problems with depth-first search → Breadth-first search as solution → Why
- How to get the actual resulting values (the test data)
<br>
## (4) Discussion
- Explain what has been achieved / found
- Compare these results and how they can be placed in a broader context
- References to previous research / related research
- Provide a reflection on what has been concluded and how this was done
<br>
## (5) Conclusion and Future Work
- Summarize the research question and the answers to the research question
- Summarizing your thoughts and conveying the larger significance of your study
- Identifying how a gap in the literature has been addressed
- Demonstrating the importance of your ideas
- Introducing possible new or expanded ways of thinking about the research problem
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
### Overall Guidelines / Tips
- [Design Flaws to Avoid](https://libguides.usc.edu/writingguide/designflaws)
- [Choosing a Research Problem](https://libguides.usc.edu/writingguide/researchproblem)
- [The Abstract](https://libguides.usc.edu/writingguide/abstract)
- [The Introduction](https://libguides.usc.edu/writingguide/introduction)
- [Literature Review](https://libguides.usc.edu/writingguide/literaturereview)
- [The Methodology](https://libguides.usc.edu/writingguide/methodology)
- [The Results](https://libguides.usc.edu/writingguide/results)
- [The Discussion](https://libguides.usc.edu/writingguide/discussion)
- [The Conclusion](https://libguides.usc.edu/writingguide/conclusion)
<br>
<br>
<br>
<br>