### Create a StudySoup account

#### Be part of our community, it's free to join!

Already have a StudySoup account? Login here

# PROGRAMMING LANGUAGES CSCI 4430

RPI

GPA 3.76

### View Full Document

## 9

## 0

## Popular in Course

## Popular in ComputerScienence

This 18 page Class Notes was uploaded by Santos Fadel on Monday October 19, 2015. The Class Notes belongs to CSCI 4430 at Rensselaer Polytechnic Institute taught by Carlos Varela in Fall. Since its upload, it has received 9 views. For similar materials see /class/224845/csci-4430-rensselaer-polytechnic-institute in ComputerScienence at Rensselaer Polytechnic Institute.

## Reviews for PROGRAMMING LANGUAGES

### What is Karma?

#### Karma is the currency of StudySoup.

#### You can buy or earn more Karma at anytime and redeem it for class notes, study guides, flashcards, and more!

Date Created: 10/19/15

CSCI4430 6969 Programming Languages Lecture Notes August 28 2006 1 Brief History of Programming Languages Ada Augusta the Countess of Lovelace the daughter of the poet Lord Byron is attributed as being the rst programmer ever using Babbage s Analytical Engine circa 1843 Imperative programming languages include Fortran Backus 1954 as one of the rst highlevel compiled programming languages created at IBM and used for numerical computing Algol Naur 1958 the precursor of many of today s programming languages Cobol Hopper 1959 for business applications BASIC Kemeny and Kurtz 1964 and Pascal Wirth 1970 developed for teaching computer programming C Kernighan and Ritchie 1971 used to program the UNIX operating system at Bell Labs and Ada Whitaker 1979 for concurrent applications Objectoriented programming languages include Simula Dahl and Nygaard 1967 used for computer simulations Smalltalk Kay 1980 where everything is an object C Stroustrop 1980 to introduce classes and objects to C programmers Eiffel Meyer 1985 which includes assertions and invariants Java Gosling 1994 initially created to program appliances and later used and introduced to program dynamic web content and C Hejlsberg 2000 Microsoftls response to Java Concurrent object actor oriented programming languages include PLASMA Hewitt 1975 Act Lieberman 1981 ABCL Yonezawa 1988 Actalk Briot 1989 Erlang Armstrong 1990 E Miller et al 1998 and SALSA Varela and Agha 1999 Scheme Sussman and Steele 1975 was developed in an attempt to understand the actor model Functional programming languages include Lisp McCarthy 1958 ML Milner 1973 and Haskell Hughes et al 1987 The most wellknown logic programming language is Prolog Colmerauer and Roussel 1972 created to process natural language French Oz Smolka 1995 is a declarative programming language that can be used to combine multiple paradigms eg functional objectoriented and logical programming Lua Ierusalimschy et al 1994 is a lightweight programming language with extensible semantics Scripting languages include Python van Rossum 1985 Perl Wall 1987 Tcl Ousterhout 1988 JavaScript Eich 1995 PHP Lerdorf 1995 and Ruby Matsumoto 1995 an objectoriented scripting language 2 Lambda Calculus The lambda calculus created by Church and Kleene in the 1930s is at the heart of functional programming languages It is Turingcomplete that is any computable function can be expressed and evaluated using the calculus It is useful to study programming language concepts because of its high level of abstraction We will brie y motivate the calculus and introduce its syntax and semantics The mathematical notation for de ning a function is with a statement such as fzz2 fZgtZ where Z is the set of all integers The rst Z is called the domain of the function or the set of values I can take The second Z is called the range of the function or the set containing all possible values of Suppose 12 and 91 z 1 Traditional function composition is de ned as fog f9IA With our functions f and g f09f91 f11 z2211l Similarly g o f 7 90 7 912 12 1 Therefore function composition is not commutativei ln lambda A calculus we can use a different notation to de ne these same concepts To de ne a function 12 we instead write Ara Similarly for 91 z 1 we instead write Ara 1 To describe a function application such as 4 we write ALIQ 2 a 22 a 4 The syntax for lambda calculus expressions is 7 variable e 2 1 l Ave 7 lambda expression l e e 7 procedure call The semantics of the lambda calculus or the way of evaluating or simplifying expressions is de ned by the rule The new expression can be read as replace freshl 17s in E with MK lnformally a fresh I is an I that is not nested inside another lambda expression We will cover free and bound variable occurrences in detail later on For example in the expression AzaQ 2 E 12 and M 2 To evaluate the expression we replace 17s in E with M to obtain ALIQ 2 a 22 a 4 ln lambda calculus all functions may only have one variable Functions with more than one variable may be expressed as a function of one variable through carryingi Suppose we have a function of two variables expressed in the normal way hzyzy hZgtltZgtZi With currying we can input one variable at a time into separate functions The rst function will take the rst argument I and return a function that will take the second variable y and will in turn provide the desired output To create the same function with currying let fZgtZgtZ and gzZgtZi That is f maps integers to a function and 9 maps integers to integers The function returns a function ya that provides the appropriate result when supplied with y For examp e 92 where 92y 2 yA So f23 923 2 3 5 ln lambda calculus this function would be described with currying by ALAin y For function application we nest two application expressions AziAyiz y 2 3 We may then simplify this expression using the semantic rule also called beta reduction AziAyiz y 2 3 Ayi2 y 3 2 3 5 The composition operation a can itself be considered a function also called higherorder function that takes two other functions as its input and returns a function as its output that is if the rst function is Z gt Z and the second function is also Z gt Z then oZgtZgtltZgtZgtZgtZi We can also de ne function composition in lambda calculus Suppose we want to compose the square function and the increment function de ned as Aziz2 and Aziz 1 We can de ne function composition as a function itself with currying by AfiAgiAzlf g Applying two variables to the composition function with currying works the same way as before except now our variables are functions AfiAgiAzlf g ALIQ Aziz 1 AgiAzlAzizQ g Aziz 1 AziOxzizQ Aziz 1 The resulting function gives the same results as I l 21 Free and Bound Variables in Lambda Calculus The process of simplifying or reducing in lambda calculus requires clari cation The general rule is to nd an expression of the form ALE M called a Tedex and replace the free 17s in E with Ms A free variable is one that is not bound to a function de nition For example in the expression AziIQ 1 1 the second I is bound to AI because it is part of the expression de ning that function which is the function 12 The nal I however is not bound to any function de nition so is considered freer Do not be confused by the fact that the variables have the same name They are in different scopes so they are totally independent of each other An equivalent C program could look like this int fint x return xx int main C int x xx1 return fx In this example the x in f could have been substituted for y or any other variable name without changing the output of the programi In the same way the lambda expression AziIQ 1 1 is identical to the expression My at 1 since the nal I is unbound or free To simplify the expression Aziziz2 1 1 2 You could let E ALIQ 11 and M 2 The only free I in E is the nal one so the correct reduction is AziIQ 2 1 The I in 12 is bound so it is not replaced However things get more complicated It is possible when performing 6 reduction to inadvertently change a free variable into a bound variable which changes the meaning of the expression In the statement MAME y y w the second y is bound to Ay and the nal y is free Taking E Aylz y and M y w we could mistakenly arrive at the simpli ed expression Ay y w 9 But now both the second and third y7s are bound because they are both a part of of the Ay function de nition This is wrong because one of the y7s should remain free as it was in the original expressioni To get around this we can change the Ay expression to a A2 expression AziAzlz 2 y 707 which again does not change the meaning of the expression This process is called a renamingi Now when we perform the 6 reduction the original two y variables are not confusedi The result is Here the free y remains free Exercises 1 aConvert the outermost z to y in the following A Calculus expressions7 if possible a AziOxzizz b AziOxzizy 2i reduce the following A Calculus expressions7 if possible a MAle y y w b Am I I Am I CSCI4430 6969 Programming Languages Lecture Notes January 20 2005 1 Brief History of Programming Languages Ada Augusta the Countess of Lovelace the daughter of the poet Lord Byron is attributed as being the first programmer ever using Babbage s Analytical Engine circa 1843 Imperative programming languages include Fortran Backus 1954 as one of the first highlevel compiled programming languages created at IBM and used for numerical computing Cobol Hopper 1960 for business applications Algol Naur 1960 BASIC Kemeny and Kurtz 1963 Pascal Wirth 1970 C Kernighan and Ritchie 1972 used to program the UNIX operating system at Bell Labs and Ada Whitaker 1979 Objectoriented programming languages include Simula Dahl and Nygaard 1967 Smalltalk Kay 1980 C Stroustrop 1980 and Java Gosling 1994 initially created to program appliances and later used and introduced to program dynamic web content Actororiented programming languages include PLASMA Hewitt 1975 Scheme Sussman and Steele 1975 Act Lieberman 1981 ABCL Yonezawa 1988 Actalk Briot 1989 Erlang Armstrong 1990 E Miller et al 1998 and SALSA Varela and Agha 1999 Functional programming languages include Lisp McCarthy 1962 ML Milner 1980 and Haskell 1990 The most wellknown logic programming language is Prolog Colmerauer and Roussel 1972 created to process natural language French Oz Smolka 1995 is a declarative programming language that can be used to combine multiple paradigms eg functional objectoriented and logical programming Scripting languages include Python van Rossum 1985 Perl Wall 1987 and Tcl Ousterhout 1988 2 Lambda Calculus The lambda calculus created by Church and Kleene in the 1930s is at the heart of functional programming languages It is Turingcomplete that is any computable function can be expressed and evaluated using the calculus It is useful to study programming language concepts because of its high level of abstraction We Will brie y motivate the calculus and introduce its syntax and semantics The mathematical notation for defining a function is With a statement such as fzz2 fZgtZ Where Z is the set of all integers The first Z is called the domain of the function or the set of values I can take The second Z is called the range of the function or the set containing all possible values of Suppose 12 and 91 z 1 Traditional function composition is defined as fog f91A With our functions f and g fogfgzfz1122z1 Similarly g o f 7 yfr 912 12 1 Therefore function composition is not commutative ln lambda A calculus we can use a different notation to de ne these same concepts To de ne a function 12 we instead write ALI Similarly for 91 z 1 we instead write Aziz 1 To describe a function application such as 4 we write ALIQ 2 a 22 a 4 The syntax for lambda calculus expressions is 7 variable e 2 1 l Ave 7 lambda expression l e e 7 procedure call The semantics of the lambda calculus or the way of evaluating or simplifying expressions is de ned by the rule The new expression can be read as replace freshl 17s in E with MK lnformally a fresh I is an I that is not nested inside another lambda expression We will cover free and bound variable occurrences in detail later on For example in the expression AzaQ 2 E 12 and M 2 To evaluate the expression we replace 17s in E with M to obtain ALIQ 2 a 22 a 4 ln lambda calculus all functions may only have one variable Functions with more than one variable may be expressed as a function of one variable through carrying Suppose we have a function of two variables expressed in the normal way hzyzy hZgtltZgtZi With currying we can input one variable at a time into separate functions The rst function will take the rst argument I and return a function that will take the second variable y and will in turn provide the desired output To create the same function with currying let fZgtZgtZ and gIZHZi That is f maps integers to a function and 9 maps integers to integers The function returns a function ya that provides the appropriate result when supplied with y For example f0 927 where 929 7 2 y So f23 g23 23 5 ln lambda calculus this function would be described with currying by ALAin y For function application we nest two application expressions AziAyiz y 2 3 We may then simplify this expression using the semantic rule also called beta reduction AziAyiz y 2 3 Ayi2 y 3 2 3 5 The composition operation a can itself be considered a function also called higherorder function that takes two other functions as its input and returns a function as its output that is if the rst function is Z A Z and the second function is also Z A Z then oZgtZXZgtZgtZgtZi We can also de ne function composition in lambda calculusi Suppose we want to compose the square function and the increment function de ned as 2 Aziz and Azizli We can de ne function composition as a function itself with currying by AfiAgiAzlf g Applying two variables to the composition function with currying works the same way as before except now our variables are functions AfiAgiAzlf g ALIQ Aziz 1 AgiAzlAzizQ g Aziz 1 AziOxzizQ Aziz 1 The resulting function gives the same results as I l 21 Free and Bound Variables in Lambda Calculus The process of simplifying or reducing in lambda calculus requires clari cation The general rule is to nd an expression of the form ME M called a Tedex and replace the free 17s in E with Ms A free variable is one that is not bound to a function de nition For example in the expression AziIQ 1 1 the second I is bound to AI because it is part of the expression de ning that function which is the function 12 The nal I however is not bound to any function de nition so is considered freer Do not be confused by the fact that the variables have the same name They are in different scopes so they are totally independent of each other An equivalent C program could look like this int fint x return xx int main int x x x 1 return fx In this example the x in f could have been substituted for y or any other variable name without changing the output of the programi In the same way the lambda expression AziIQ z l is identical to the expression My 11 since the nal I is unbound or free To simplify the expression Aziziz2 11 2 You could let E ALIQ 11 and M 2 The only free I in E is the nal one so the correct reduction is AziIQ 2 1 The I in 12 is bound so it is not replaced However things get more complicated It is possible when performing 6 reduction to inadvertently change a free variable into a bound variable which changes the meaning of the expression In the statement MAME y y w the second y is bound to Ay and the nal y is free Taking E Aylz y and M y w we could mistakenly arrive at the simpli ed expression Ay y w 9 But now both the second and third y7s are bound because they are both a part of of the Ay function de nition This is wrong because one of the y7s should remain free as it was in the original expressioni To get around this we can change the Ay expression to a A2 expression AziAzlz 2 y 707 which again does not change the meaning of the expression This process is called a renamingi Now when we perform the 6 reduction the original two y variables are not confusedi The result is Here the free y remains free 22 Order of Evaluation There are different ways to evaluate lambda expressions The rst method is to always fully evaluate the arguments of a function before evaluating the function itself This order is called applicative order In the expression AziIQ Azizl 2 the argument Arr l 2 should be simpli ed rst The result is a Mix 2 1 a Mix 3 a 32 a 9 Another method is to evaluate the leftmost redex rst A redex is an expression of the form ALE M on which 6 reduction can be performed This order is called normal order The same expression would be reduced from the outside in with E 12 and M Arr l 2 In this case the result is a Azizl 22 a 212 a 9 As you can see both orders produced the same result But is this always the case It turns out that the answer is no for certain expressions whose simpli cation does not terminatei Consider the expression It is easy to see that reducing this expression gives the same expression back creating an in nite loop If we consider the expanded expression Ari z Aztz we nd that the two evaluation orders are not equivalent Using applicative order the AL I 1 AL I expression must be evaluated rst but this never terminatesi If we use normal order however we evaluate the entire expression rst with E 3 and M z Aztz Since there are no 17s in E to replace the result is simply 3 It turns out that it is only in these particular nonterminating cases that the two orders may give different results The ChurchRosser theorem also called the con uence property or the diamond property states that if a lambda calculus expression can be evaluated in two different ways and both ways terminate both ways will yield the same result Also if there is a way for an expression to terminate using normal order will cause the termination In other words normal order is the best if you want to avoid in nite loopsi Take as another example the C program int loop C return 100130 int fint x int y C return x int main C return f3 100130 In this case using applicative order will cause the program to hang because the second argument loop will be evaluated Using normal order will terminate because the unneeded y variable will never be evaluate Though normal order is better in this respect applicative order is the one used by most programming languages Why Consider the function z I To nd f42 using normal order we hold off on evaluating the argument until after placing the argument in the function so it yie f42 42 42 2 2 4 and the division needs to be done twice If we use applicative order we get f42 f0 22 47 which only requires one division Since applicative order avoids repetitive computations it is the preferred method of evaluation in most programming languages where short execution time is critical Exercises 1 aConvert the outermost z to y in the following A Calculus expressions7 if possible a AziOxzizz b AziOxzizy 2i reduce the following A Calculus expressions7 if possible a MAle y y w b Am I I Am I CSCl4430 6969 Programming Languages Lecture Notes on the Lambda Calculus Carlos A Varela September 17 2007 The lambda calculus created by Church and Kleene in the 1930s is at the heart of functional program ming languages It is Turingcomplete that is any computable function can be expressed and evaluated using the calculus It is useful to study programming language concepts because of its high level of ab stractioni We will brie y motivate the calculus and introduce its syntax and semantics The mathematical notation for de ning a function is with a statement such as fzz2 szHZ where Z is the set of all integers The rst Z is called the domain of the function or the set of values I can take The second Z is called the range of the function or the set containing all possible values of Suppose 12 and 91 z 1 Traditional function composition is de ned as fog f91A With our functions f and g fogfgzfzl1221li Similarly g o f 90 7 912 12 1 Therefore function composition is not commutative ln lambda A calculus we can use a different notation to de ne these same concepts To de ne a function 12 we instead write Ara Similarly for 91 z l we instead write Ara 1 To describe a function application such as 4 we write Am 2 a 22 a 4 The syntax for lambda calculus expressions is 7 variable e 2 1 l Ave 7 lambda expression l e e 7 procedure call The semantics of the lambda calculus or the way of evaluating or simplifying expressions is de ned by the rule The new expression can be read as replace freshl 17s in E with MK lnformally a fresh I is an I that is not nested inside another lambda expression We will cover free and bound variable occurrences in detail later on For example in the expression ALIQ 2 E 12 and M 2 To evaluate the expression we replace 17s in E with M to obtain ALIQ 2 a 22 a 4 ln lambda calculus all functions may only have one variable Functions with more than one variable may be expressed as a function of one variable through curryz39ngi Suppose we have a function of two variables expressed in the normal way hzyzy hZgtltZgtZi With currying we can input one variable at a time into separate functions The rst function will take the rst argument I and return a function that will take the second variable y and will in turn provide the desired output To create the same function with currying let fZgtZgtZ and gzZHZi That is f maps integers to a function and 9 maps integers to integers The function returns a function ya that provides the appropriate result when supplied with y For examp e f0 927 where 929 2 y So f23 923 2 3 5 ln lambda calculus this function would be described with currying by ALAin y For function application we nest two application expressions AziAyiz y 2 3 We may then simplify this expression using the semantic rule also called beta reduction AziAyiz y 2 3 Ayi2 y 3 2 3 5 The composition operation a can itself be considered a function also called higherorder function that takes two other functions as its input and returns a function as its output that is if the rst function is Z A Z and the second function is also Z A Z then oZgtZXZgtZgtZgtZi We can also de ne function composition in lambda calculusi Suppose we want to compose the square function and the increment function de ned as Aziz2 and Aziz 1 We can de ne function composition as a function itself with currying by AfiAgiAzlf g Applying two variables to the composition function with currying works the same way as before except now our variables are functions AfiAgiAzlf g Aziz2 Aziz 1 AgiAzlAzizQ g Aziz 1 AziOxzizQ Aziz 1 The resulting function gives the same results as I 1 1 Free and Bound Variables in Lambda Calculus The process of simplifying or reducing in lambda calculus requires clari cation The general rule is to nd an expression of the form ALE M called a Tedex and replace the free 17s in E with Ms A free variable is one that is not bound to a function de nition For example in the expression AziIQ 1 1 the second I is bound to AI because it is part of the expression de ning that function which is the function 12 The nal I however is not bound to any function de nition so is considered freer Do not be confused by the fact that the variables have the same name They are in different scopes so they are totally independent of each other An equivalent C program could look like this int fint x return xx int main C int x xx1 return fx In this example the x in f could have been substituted for y or any other variable name without changing the output of the programi In the same way the lambda expression AziIQ 1 1 is identical to the expression My at 1 since the nal I is unbound or free To simplify the expression Aziziz2 1 1 2 You could let E ALIQ 11 and M 2 The only free I in E is the nal one so the correct reduction is Oxer 2 1 The I in 12 is bound so it is not replaced However things get more complicated It is possible when performing 6 reduction to inadvertently change a free variable into a bound variable which changes the meaning of the expression In the statement MAME y y w the second y is bound to Ay and the nal y is free Taking E Ayiz y and M y w we could mistakenly arrive at the simpli ed expression Ay y w 9 But now both the second and third y7s are bound because they are both a part of of the Ay function de nition This is wrong because one of the y7s should remain free as it was in the original expressioni To get around this we can change the Ay expression to a A2 expression AziAztz 2 y 707 which again does not change the meaning of the expression This process is called a renamingi Now when we perform the 6 reduction the original two y variables are not confused The result is Here the free y remains free 2 Order of Evaluation There are different ways to evaluate lambda expressions The rst method is to always fully evaluate the arguments of a function before evaluating the function itself This order is called applicative order In the expression AziIQ Aziz 1 2 the argument Aziz 1 2 should be simpli ed rst The result is a Am 2 1 a Am 3 a 32 a 9 Another method is to evaluate the leftmost redex rst A redex is an expression of the form ALE M on which 6 reduction can be performed This order is called normal order The same expression would be reduced from the outside in with E 12 and M Aziz 1 2 In this case the result is a AHH 22 a 212 a 9 As you can see both orders produced the same result But is this always the case It turns out that the answer is no for certain expressions whose simpli cation does not terminatei Consider the expression It is easy to see that reducing this expression gives the same expression back creating an in nite loop If we consider the expanded expression Aziy z Aztz we nd that the two evaluation orders are not equivalent Using applicative order the AL I I Am I expression must be evaluated rst but this never terminatesi If we use normal order however we evaluate the entire expression rst with E y and M z Aztz Since there are no 17s in E to replace the result is simply yr It turns out that it is only in these particular nonterminating cases that the two orders may give different results The ChurchRosser theorem also called the con uence property or the diamond property states that if a lambda calculus expression can be evaluated in two different ways and both ways terminate both ways will yield the same result Also if there is a way for an expression to terminate using normal order will cause the termination In other words normal order is the best if you want to avoid in nite loopsi Take as another example the C program int loop return 100130 int fint x int y return x int main return f3 100130 In this case using applicative order will cause the program to hang because the second argument loop will be evaluated Using normal order will terminate because the unneeded y variable will never be evaluate Though normal order is better in this respect applicative order is the one used by most programming languages Why Consider the function z I To nd f42 using normal order we hold off on evaluating the argument until after placing the argument in the function so it yie f42 4242 22 4 and the division needs to be done twice If we use applicative order we get f42 f2 22 4 which only requires one division Since applicative order avoids repetitive computations it is the preferred method of evaluation in most programming languages where short execution time is critical 3 Combinators Any lambda calculus expression with no free variables is called a combinator Because the meaning of a lambda expression is dependent only on the bindings of its free variables combinators always have the same meaning independently of the context in which they are used There are certain combinators that are very useful in lambda calculus The identity combinator is de ned as I ALI It simply returns whatever is given to it For example I 5 ALI 5 5 The identity combinator in Oz can be written declare I fun X X end Contrast it to for example a Circumference function declare Circumference fun Radius 2PIRadius end The semantics of the Circumference function depends on the de nitions of PI and It is therefore not a combinator The application combinator is App Afle 1 and allows you to evaluate a function with an argument For example App m2 3 z ALIQ 3 Aziziz2 z 3 ALIQ 3 9 The sequencing combinator is Seq AziAyiOxziy z where 2 is chosen so that it does not appear free in y This combinator guarantees that x is evaluated before y which is important in programs with side effects Assuming we had a display function sending output to the console an example is Seq display hello display world 4 Currying The curryng higherorder function takes a function and returns a curried version of the function For example it would take as input the Plus function which has the type Plus Z X Z A Z The type of a function de nes what kinds of things the function can receive and what kinds of things it produces as output In this case Plus takes two integers Z X Z and returns an integer The de nition of Plus in Oz is declare Plus fun X Y XY end The currying combinator would then return the curried version of Plus called PlusC which has the type PlusC Z A Z A Z Here PlusC takes one integer as input and returns a function from the integers to the integers Z A Z The de nition of PlusC in Oz is declare PlusC The Oz version of the currying combinator which we will call Curry would work as follows Curry Plus PlusCi Using the input and output types above the type of the Curry function is CurryZgtltZgtZgtZgtZgtZi So the Curry function should take as input an uncurried function and return a curried function In Oz we can write Curry as follows declare Curry fun F fun X fun Y F X Y end end end Exercises 20 aconvert the outermost z to y in the following A calculus expressions if possible a ALQxLzz b ALQxLzy 21 reduce the following A calculus expressions if possible a MAle y y w b A1 I I Am I 22 Install MozartOz in your computer 23 De ne functions Plus PlusC its curried version and test them 24 1 Write a function composition combinator in the A calculus 25 1 De ne a curried version of Compose in Oz ComposeC Without using the Curry combinator Hint It should look very similar to the A calculus expression from the previous exercise

### BOOM! Enjoy Your Free Notes!

We've added these Notes to your profile, click here to view them now.

### You're already Subscribed!

Looks like you've already subscribed to StudySoup, you won't need to purchase another subscription to get this material. To access this material simply click 'View Full Document'

## Why people love StudySoup

#### "Knowing I can count on the Elite Notetaker in my class allows me to focus on what the professor is saying instead of just scribbling notes the whole time and falling behind."

#### "I made $350 in just two days after posting my first study guide."

#### "Knowing I can count on the Elite Notetaker in my class allows me to focus on what the professor is saying instead of just scribbling notes the whole time and falling behind."

#### "It's a great way for students to improve their educational experience and it seemed like a product that everybody wants, so all the people participating are winning."

### Refund Policy

#### STUDYSOUP CANCELLATION POLICY

All subscriptions to StudySoup are paid in full at the time of subscribing. To change your credit card information or to cancel your subscription, go to "Edit Settings". All credit card information will be available there. If you should decide to cancel your subscription, it will continue to be valid until the next payment period, as all payments for the current period were made in advance. For special circumstances, please email support@studysoup.com

#### STUDYSOUP REFUND POLICY

StudySoup has more than 1 million course-specific study resources to help students study smarter. If you’re having trouble finding what you’re looking for, our customer support team can help you find what you need! Feel free to contact them here: support@studysoup.com

Recurring Subscriptions: If you have canceled your recurring subscription on the day of renewal and have not downloaded any documents, you may request a refund by submitting an email to support@studysoup.com

Satisfaction Guarantee: If you’re not satisfied with your subscription, you can contact us for further help. Contact must be made within 3 business days of your subscription purchase and your refund request will be subject for review.

Please Note: Refunds can never be provided more than 30 days after the initial purchase date regardless of your activity on the site.