latka: a language for random text generation · background: roguelikes figure :dwarf fortress c...

28
Latka: A Language for Random Text Generation Getty D. Ritter POPL OBT — Jan 25, 2014 Getty D. Ritter Latka: A Language for Random Text Generation POPL OBT — Jan 25, 2014 1 / 23

Upload: others

Post on 20-May-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka: A Language for Random Text Generation

Getty D. Ritter

POPL OBT — Jan 25, 2014

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 1 / 23

Page 2: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Background: Roguelikes

Figure : Brogue c©2012 Brian Walker

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 2 / 23

Page 3: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Background: Roguelikes

Figure : Dwarf Fortress c©2002-2012 Tarn Adams

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 3 / 23

Page 4: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Lord Tiahaki’ne

This is Lord Tiahaki’ne, an Elder of the Kute’aha. Its carapace ismottled and it wears fine jewelry of gold and pearls.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 4 / 23

Page 5: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Hatchling Wipa’a

This is Wipa’a, a Hatchling of the Kute’aha. It has just beenborn to Peko, just one of 133 siblings.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 5 / 23

Page 6: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Two Basic Problems

1 Concisely and reliably express a nondeterministic set of strings forhuman consumption.

2 Provide primitives appropriate to constructing text at a higher levelthan string concatenation.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 6 / 23

Page 7: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Solution

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 7 / 23

Page 8: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Solution

Write an embedded DSL for an existing language. Don’t reinvent thewheel.

description :: StringChoiceM ()

description = chooseRole >>= \caseLord -> do

name <- genName

appr <- genAppearance

...

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 8 / 23

Page 9: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

More Entertaining Solution

Because reinventing the wheel is fun: the Latka language. Embedprobabalistic choice as an effect, and select primitive operationsappropriate to the problem domain.

consonant = "p" | "t" | "k" | "w"

| "h" | "m" | "n"

vowel = ("a" | "e" | "i" | "o" | "u") (4: "" | "’")

syllable = 4: consonant vowel | vowel

word = (4 | 5 | 6) @ syll

puts word

{- kinane, hupitu’, wuteni, newai,

- puwupo, kuikia, teipi’, ituwoi,

- kaekupu, ikukukiepa’, henewu, topano

-}

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 9 / 23

Page 10: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Command Language

A single command, only available at the top-level:

puts "Hello, World!"

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 10 / 23

Page 11: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

Basic choice and string concatenation:

a = "this" "that" "whatever"

-- a evaluates to "thisthatwhatever"

b = "this" | "that" | "whatever"

-- b evaluates to "this" or "that" or "whatever"

c = 9: "this" | "that"

-- c evalutes to "this" nine times out of ten

d = (8 @ "na") " batman"

-- d evaluates to exactly what you’d expect

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 11 / 23

Page 12: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

. . . with a dash of generic-strongly-typed-functional-language:

data Maybe t = Just t | Nothing

foo : Maybe (String * String) -> String

foo x = case x of

Just.p -> "(" fst.p "," snd.p ")"

Nothing -> "()"

The f.x syntax for function application is borrowed from Dijkstra.

f.x.y == (f.x).y

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 12 / 23

Page 13: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

Expressions are typically call-by-name

cbn = let x = "a" | "b"

in x x

-- { "aa", "ab", "ba", "bb" }

But you can force call-by-value by using the fixed keyword

cbv = let fixed x = "a" | "b"

in x x

-- { "aa", "bb" }

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 13 / 23

Page 14: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

This is necessary for long text descriptions:

let gender = Female | Male | Other in

"A " noun.gender " stands nearby. "

"You approach " objpronoun.gender "."

A man stands nearby. You approach him.

A person stands nearby. You approach them.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 14 / 23

Page 15: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

This is necessary for long text descriptions:

let gender = Female | Male | Other in

"A " noun.gender " stands nearby. "

"You approach " objpronoun.gender "."

A man stands nearby. You approach her.

A woman stands nearby. You approach him.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 15 / 23

Page 16: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Expression Language

This is necessary for long text descriptions:

let fixed gender = Female | Male | Other in

"A " noun.gender " stands nearby. "

"You approach " objpronoun.gender "."

A woman stands nearby. You approach her.

A person stands nearby. You approach them.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 16 / 23

Page 17: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Static Guarantees

Strongly typed with type inference and optional type annotations.

Latka also only allows structural recursion.

Consequently, Latka programs by construction cannot go wrong.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 17 / 23

Page 18: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Static Guarantees

Strongly typed with type inference and optional type annotations.

Latka also only allows structural recursion.

Consequently, Latka programs by construction cannot go wrong.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 17 / 23

Page 19: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Static Guarantees

Strongly typed with type inference and optional type annotations.

Latka also only allows structural recursion.

Consequently, Latka programs by construction cannot go wrong.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 17 / 23

Page 20: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Type System

Unremarkable, save a single experimental feature: Var a is a type ofarbitrary-length tuples of types convertible to a. The only valid operationon Var a is

fgt : Var a -> List a

Var a can only appear in negative position in an arrow type.

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 18 / 23

Page 21: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Type System

A lot of work for relatively little benefit:

listAll : Var String -> String

listAll v =

let go.[] = "nothing."

go.[x] = x "."

go.[x,y] = x " and " y "."

go (x::xs) = x ", " go xs

in go.(fgt.v)

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 19 / 23

Page 22: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Type System

But still a small convenience:

puts listAll.()

-- "nothing."

puts listAll.(2,True,"blue")

-- "2, True and blue."

puts listAll.(5,\x -> x)

-- compile-time error, can’t convert (a -> a) to String

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 20 / 23

Page 23: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

Latka Standard Library

Still a work-in-progress, but crucially must provide intelligent primitives forconstructing human language, e.g. for creating sentences, words, propernouns, &c

puts se.( "one two"

, wd."three"

, pn."four"

)

-- "One two three Four."

puts pa.( lst.( "one", "two" ) )

-- " One, two."

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 21 / 23

Page 24: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

The Future of Latka

Compile to a “reasonable” target

Refine the human-language API

Explore what constitutes a useful standard library (e.g.Language.Natural.Latin)

Use Latka to produce data other than text

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 22 / 23

Page 25: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

The Future of Latka

Compile to a “reasonable” target

Refine the human-language API

Explore what constitutes a useful standard library (e.g.Language.Natural.Latin)

Use Latka to produce data other than text

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 22 / 23

Page 26: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

The Future of Latka

Compile to a “reasonable” target

Refine the human-language API

Explore what constitutes a useful standard library (e.g.Language.Natural.Latin)

Use Latka to produce data other than text

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 22 / 23

Page 27: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

The Future of Latka

Compile to a “reasonable” target

Refine the human-language API

Explore what constitutes a useful standard library (e.g.Language.Natural.Latin)

Use Latka to produce data other than text

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 22 / 23

Page 28: Latka: A Language for Random Text Generation · Background: Roguelikes Figure :Dwarf Fortress c 2002-2012 Tarn Adams Getty D. Ritter Latka: A Language for Random Text GenerationPOPL

And So Forth

data Rank = Hatchling | Elder

carapaceColor : String

carapaceColor = "mottled" | "yellow" | "red" | "black"

descriptionFor : Rank -> String -> Para

descriptionFor.Hatchling.name =

pa.( se.( "This is ", name

, ", a Hatchling of the Kute’aha" )

, ( se.( "It will ", "soon" | "eventually"

, "graduate and become an adult" )

| se.( "It has just been born to"

, kuteahaName, "and has"

, 1d200, "siblings" ) ) )

descriptionFor.Elder.name = ...

Getty D. Ritter Latka: A Language for Random Text GenerationPOPL OBT — Jan 25, 2014 23 / 23