Guided Practice 2.2: The Prisoner's Dilemma

Here's one solution. We have a structural decomposition on move1, which calls one of two help functions. Each help function is a structural decomposition on move2.

```;; STRATEGY: struct decomp on move1
(define (outcome move1 move2)
(cond
[(string=? move1 "betray")
(outcome-after-betray move2)]
[(string=? move1 "don't betray")
(outcome-after-dont-betray move2)]))

;; outcome-after-betray : Move -> Number
;; GIVEN: player2's move
;; RETURNS: the outcome if player1 moved "betray"
;; STRATEGY: struct decomp on move2
(define (outcome-after-betray move2)
(cond
[(string=? move2 "betray") -3]
[(string=? move2 "don't betray") 0]))

;; outcome-after-dont-betray : Move -> Number
;; GIVEN: player2's move
;; RETURNS: the outcome if player1 moved "don't betray"
;; STRATEGY: struct decomp on move2
(define (outcome-after-dont-betray move2)
(cond
[(string=? move2 "betray") -12]
[(string=? move2 "don't betray") -1]))
```

Notice how the information we have about the situation in which we call the function is shown twice:

• once in the function name
• and again in purpose statement

We'll see much more about expressing context information in later modules.