Declarative Computation Model

Similar documents
On Academic Dishonesty. Declarative Computation Model. Single assignment store. Single assignment store (2) Single assignment store (3)

Carlos Varela RPI September 19, Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL

Declarative Programming Techniques

Programming Language Concepts, cs2104 Lecture 04 ( )

State, Object-Oriented Programming Explicit State, Polymorphism (CTM ) Objects, Classes, and Inheritance (CTM )

Declarative Concurrency (CTM 4)

Programming Language Concepts, cs2104 Lecture 09 ( )

Logic Programming (CTM ) Constraint Programming: Constraints and Computation Spaces

Lazy evaluation. Lazy evaluation (3) Lazy evaluation (2) Lazy execution. Example. Declarative Concurrency. Lazy Execution (VRH 4.

Declarative Concurrency (CTM 4)

Types in Programming Languages Dynamic and Static Typing, Type Inference (CTM 2.8.3, EPL* 4) Abstract Data Types (CTM 3.7) Monads (GIH** 9)

Lecture 5: Declarative Programming. The Declarative Kernel Language Machine. September 12th, 2011

Programming Language Concepts, cs2104 Lecture 01 ( )

Programming Language Concepts, CS2104 Lecture 7

Lecture 8: Recursion and Iteration. Exceptions. Declarative Programming.

Lecture 7: General Computation Models

UNIT 3

Exam for 2G1512 DatalogiII, Apr 12th

Lecture 6: The Declarative Kernel Language Machine. September 13th, 2011

Lecture 4: The Declarative Sequential Kernel Language. September 5th 2011

Concepts, Techniques, and Models of Computer Programming

An Oz Subset. 1 Microsyntax for An Oz Subset. Notational Conventions. COP 4020 Programming Languages 1 January 17, 2012

OCaml. ML Flow. Complex types: Lists. Complex types: Lists. The PL for the discerning hacker. All elements must have same type.

Lecture 21: Relational Programming II. November 15th, 2011

Homework 4: Declarative Concurrency

Don t write anything in the field marked Eventuell ekstra ID. For each subtask, choose the answer you think is the most correct one.

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Closures. Mooly Sagiv. Michael Clarkson, Cornell CS 3110 Data Structures and Functional Programming

Programming Languages

Today's Topics. CISC 458 Winter J.R. Cordy

A Concepts-Based Approach for Teaching Programming

News and remarks. CS68 Principles of Programming Languages. Contents today. Concurrency. Declarative concurrency. Threads

Variables. Substitution

SMURF Language Reference Manual Serial MUsic Represented as Functions

Overview. Distributed Computing with Oz/Mozart (VRH 11) Mozart research at a glance. Basic principles. Language design.

Programming Languages

News. Programming Languages. Complex types: Lists. Recap: ML s Holy Trinity. CSE 130: Spring 2012

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

A Second Look At ML. Chapter Seven Modern Programming Languages, 2nd ed. 1

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler so far

Programming Languages

UNIT-4 (COMPILER DESIGN)

RYERSON POLYTECHNIC UNIVERSITY DEPARTMENT OF MATH, PHYSICS, AND COMPUTER SCIENCE CPS 710 FINAL EXAM FALL 96 INSTRUCTIONS

Begin at the beginning

Plan (next 4 weeks) 1. Fast forward. 2. Rewind. 3. Slow motion. Rapid introduction to what s in OCaml. Go over the pieces individually

Syntax-Directed Translation Part II

CS 457/557: Functional Languages

Chapter 1. Fundamentals of Higher Order Programming

Programming Languages Third Edition. Chapter 7 Basic Semantics

Formal Semantics. Prof. Clarkson Fall Today s music: Down to Earth by Peter Gabriel from the WALL-E soundtrack

CSE 504. Expression evaluation. Expression Evaluation, Runtime Environments. One possible semantics: Problem:

Operational Semantics. One-Slide Summary. Lecture Outline

Functional Programming. Pure Functional Languages

Lecture 7: Type Systems and Symbol Tables. CS 540 George Mason University

CA4003 Compiler Construction Assignment Language Definition

proc {P V1 V2... Vn} <Decl> in <Stmt> end is equivalent to proc {P V1 V2... Vn} local <Decl> in <Stmt> end end, where <Decl> is a

Syntax Errors; Static Semantics

Programming Languages (CSCI 4430/6430) History, Syntax, Semantics, Essentials, Paradigms

\n is used in a string to indicate the newline character. An expression produces data. The simplest expression

Tail Calls. CMSC 330: Organization of Programming Languages. Tail Recursion. Tail Recursion (cont d) Names and Binding. Tail Recursion (cont d)

Functional Programming. Pure Functional Languages

CSE 307: Principles of Programming Languages

Basic concepts. Chapter Toplevel loop

proc {Produce State Out} local State2 Out2 in State2 = State + 1 Out = State Out2 {Produce State2 Out2}

GBIL: Generic Binary Instrumentation Language. Language Reference Manual. By: Andrew Calvano. COMS W4115 Fall 2015 CVN

VTU NOTES QUESTION PAPERS NEWS RESULTS FORUMS THE STACK

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

CSE 130 [Winter 2014] Programming Languages

CMSC330 Fall 2013 Practice Problems 6 Solutions

Programming Languages Third Edition. Chapter 9 Control I Expressions and Statements

Program Correctness and Efficiency. Chapter 2

Mozart System Limitations for Version (draft)

Chapter 3 Linear Structures: Lists

The Environment Model. Nate Foster Spring 2018

OCaml. History, Variants. ML s holy trinity. Interacting with ML. Base type: Integers. Base type: Strings. *Notes from Sorin Lerner at UCSD*

Lecture Outline. COOL operational semantics. Operational Semantics of Cool. Motivation. Lecture 13. Notation. The rules. Evaluation Rules So Far

Implementing a VSOP Compiler. March 20, 2018

Booleans (aka Truth Values) Programming Languages and Compilers (CS 421) Booleans and Short-Circuit Evaluation. Tuples as Values.

CS4215 Programming Language Implementation. Martin Henz

Programming Languages

Programming Languages (CSCI 4430/6430) Part 1: Functional Programming: Summary

15 150: Principles of Functional Programming. Exceptions

Lecture Outline. COOL operational semantics. Operational Semantics of Cool. Motivation. Notation. The rules. Evaluation Rules So Far.

The role of semantic analysis in a compiler

Chapter 3 Linear Structures: Lists

Functional Programming. Pure Functional Programming

CMSC 330: Organization of Programming Languages. Operational Semantics

G Programming Languages - Fall 2012

Formal Syntax and Semantics of Programming Languages

COP4020 Programming Assignment 2 - Fall 2016

CS 4240: Compilers and Interpreters Project Phase 1: Scanner and Parser Due Date: October 4 th 2015 (11:59 pm) (via T-square)

LECTURE 16. Functional Programming

Syntax-Directed Translation Part I

# true;; - : bool = true. # false;; - : bool = false 9/10/ // = {s (5, "hi", 3.2), c 4, a 1, b 5} 9/10/2017 4

Semantic Analysis. Lecture 9. February 7, 2018

Automated Reasoning. Natural Deduction in First-Order Logic

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

1 Lexical Considerations

INF4820: Algorithms for Artificial Intelligence and Natural Language Processing. Common Lisp Fundamentals

Semantic Analysis. Outline. The role of semantic analysis in a compiler. Scope. Types. Where we are. The Compiler Front-End

Transcription:

Declarative Computation Model Kernel language semantics revisited (VRH 2.4.5) From kernel to practical language (VRH 2.6) Exceptions (VRH 2.7) Carlos Varela RPI March 19, 2012 Adapted with permission from: Seif Haridi KTH Peter Van Roy UCL C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 1

Sequential declarative computation model The kernel language semantics revisited. Suspable statements: if, case, procedure application. Procedure values Procedure introduction Procedure application. C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 2

Conditional The semantic statement is ( if x then s 1 else s 2, E) If the activation condition (E( x ) is determined) is true: If E( x ) is not Boolean (true, false), raise an error E( x ) is true, push ( s 1, E) on the stack E( x ) is false, push ( s 2, E) on the stack If the activation condition (E( x ) is determined) is false: Susp C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 3

Case statement The semantic statement is ( case x of l ( f 1 : x 1 f n : x n ) then s 1 else s 2, E) If the activation condition (E( x ) is determined) is true: If E( x ) is a record, the label of E( x ) is l and its arity is [ f 1 f n ], and x 1 x n are indepent: push (local x 1 = x. f 1 x n = x. f n in s 1, E) on the stack Otherwise, push ( s 2, E) on the stack If the activation condition (E( x ) is determined) is false: Susp C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 4

Procedure values Constructing a procedure value in the store is not simple because a procedure may have external references C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 5

Procedure values (2) P x 1 (, ) Q x 2 x 2 (, ) proc {$} {Browse hello} Browse x 0 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 6

Procedure values (3) The semantic statement is ( x = proc {$ y 1... y n } s, E) y 1... y n are the (formal) parameters of the procedure Other free identifiers in s are called external references z 1... z k These are defined by the environment E where the procedure is declared (lexical scoping) The contextual environment of the procedure CE is E { z 1... z k } When the procedure is called CE is used to construct the environment for execution of s (proc {$ y 1... y n } s, CE) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 7

Procedure introduction The semantic statement is ( x = proc {$ y 1... y n } s, E) Create a contextual environment: CE = E { z 1... z k } where z 1... z k are external references in s. Create a new procedure value of the form: (proc {$ y 1... y n } s, CE), refer to it by the variable x P Bind the store variable E( x ) to x P Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 8

Procedure application The semantic statement is ({ x y 1 y n }, E) If the activation condition (E( x ) is determined) is true: If E( x ) is not a procedure value, or it is a procedure with arity that is not equal to n, raise an error If E( x ) is (proc {$ z 1... z n } s, CE), push ( s, CE + { z 1 E( y 1 ) z n E( y n )} ) on the stack If the activation condition (E( x ) is determined) is false: Susp C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 9

Execution examples s 1 s 2 local Max C in proc {Max X Y Z} s 3 if X >= Y then Z=X else Z=Y {Max 3 5 C} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 10

Execution examples (2) s 1 s 2 local Max C in proc {Max X Y Z} s 3 if X >= Y then Z=X else Z=Y s 4 {Max 3 5 C} Initial state ([( s 1, )], ) After local Max C in ( [( s 2, {Max m, C c})], {m, c} ) After Max binding ( [( s 4, {Max m, C c})], {m = (proc{$ X Y Z} s 3, ), c} ) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 11

Execution examples (3) s 1 s 2 local Max C in proc {Max X Y Z} s 3 if X >= Y then Z=X else Z=Y s 4 {Max 3 5 C} After Max binding ( [( s 4, {Max m, C c})], {m = (proc{$ X Y Z} s 3, ), c} ) After procedure call ( [( s 3, {X t 1, Y t 2, Z c}) ], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c} ) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 12

Execution examples (4) s 1 s 2 local Max C in proc {Max X Y Z} s 3 if X >= Y then Z=X else Z=Y s 4 {Max 3 5 C} After procedure call ( [( s 3, {X t 1, Y t 2, Z c})], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c} ) After T = (X>=Y) ( [( s 3, {X t 1, Y t 2, Z c, T t}) ], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c, t=false} ) ( [(Z=Y, {X t 1, Y t 2, Z c, T t}) ], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c, t=false} ) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 13

Execution examples (5) s 1 s 2 local Max C in proc {Max X Y Z} s 3 if X >= Y then Z=X else Z=Y s 4 {Max 3 5 C} ( [(Z=Y, {X t 1, Y t 2, Z c, T t}) ], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c, t=false} ) ( [ ], {m = (proc{$ X Y Z} s 3, ), t 1 =3, t 2 =5, c=5, t=false} ) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 14

Procedures with external references s 1 s 2 local LB Y C in Y = 5 proc {LB X Z} s 3 if X >= Y then Z=X else Z=Y {LB 3 C} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 15

Procedures with external references s 1 s 2 The procedure value of LB is (proc{$ X Z} s 3, {Y y}) The store is {y = 5, } local LB Y C in Y = 5 proc {LB X Z} s 3 if X >= Y then Z=X else Z=Y {LB 3 C} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 16

Procedures with external references s 1 s 2 The procedure value of LB is (proc{$ X Z} s 3, {Y y}) The store is {y = 5, } local LB Y C in Y = 5 proc {LB X Z} s 3 if X >= Y then Z=X else Z=Y {LB 3 C} STACK: [( {LB T C}, {Y y, LB lb, C c, T t}) ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 17

Procedures with external references s 1 s 2 local LB Y C in Y = 5 proc {LB X Z} s 3 if X >= Y then Z=X else Z=Y {LB 3 C} STACK: [( {LB T C}, {Y y, LB lb, C c, T t}) ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c} STACK: [( s 3, {Y y, X t, Z c}) ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 18

Procedures with external references s 1 s 2 local LB Y C in Y = 5 proc {LB X Z} s 3 if X >= Y then Z=X else Z=Y {LB 3 C} STACK: [( s 3, {Y y, X t, Z c}) ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c} STACK: [(Z=Y, {Y y, X t, Z c}) ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c} STACK: [ ] STORE: {y = 5, lb = (proc{$ X Z} s 3, {Y y}), t = 3, c = 5} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 19

From the kernel language to a practical language Interactive interface the declare statement and the global environment Ext kernel syntax to give a full, practical syntax nesting of partial values implicit variable initialization expressions nesting the if and case statements andthen and orelse operations Linguistic abstraction Functions Exceptions C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 20

The interactive interface (declare) The interactive interface is a program that has a single global environment declare X Y Augments (and overrides) the environment with new mappings for X and Y {Browse X} Inspects the store and shows partial values, and incremental changes C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 21

The interactive interface (declare) Browse R X Y procedure value value a Store Environment b C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 22

declare X Y Browse R X Y procedure value b value a Store Environment unbound x i unbound x i+1 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 23

Syntactic extensions Nested partial values person(name: George age:25) local A B in A= George B=25 person(name:a age:b) Implicit variable initialization local pattern = expression in statement Example: assume T has been defined, then local tree(key:a left:b right:c value:d) = T in statement is the same as: local A B C D in T = tree(key:a left:b right:c value:d) <statement> C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 24

Extracting fields in local statement declare T : local in : T = tree(key:seif age:48 profession:professor) tree(key:a...) = T statement C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 25

Nested if and case statements Observe a pair notation is: 1 # 2, is the tuple # (1 2) case Xs # Ys of nil # Ys then s 1 [] Xs # nil then s 2 [] (X Xr) # (Y Yr) andthen X=<Y then s 3 else s 4 Is translated into (assuming X,Xr,Y,Yr not free in s 4 ) case Xs of nil then s 1 else case Ys of nil then s 2 else case Xs of X Xr then case Ys of Y Yr then if X=<Y then s 3 else s 4 else s 4 else s 4 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 26

Expressions An expression is a sequence of operations that returns a value A statement is a sequence of operations that does not return a value. Its effect is on the store, or outside of the system (e.g. read/write a file) 11*11 X=11*11 expression statement C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 27

Functions as linguistic abstraction R = {F X1... Xn} {F X1... Xn R} fun {F X1... Xn} statement expression proc {F X1... Xn R} statement R = expression statement statement C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 28

Nesting in data structures Ys = {F X} {Map Xr F} Is unnested to: local Y Yr in Ys = Y Yr {F X Y} {Map Xr F Yr} The unnesting of the calls occurs after the data structure C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 29

Functional nesting Nested notations that allows expressions as well as statements local R in {F X1... Xn R} {Q R...} Is written as (equivalent to): {Q {F X1... Xn}...} expression statement C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 30

Conditional expressions R = if expr 1 then expr 2 else expr 3 expression fun {Max X Y} if X>=Y then X else Y if expr 1 then R = expr 2 else R = expr 3 statement proc {Max X Y R} R = ( if X>=Y then X else Y ) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 31

Example fun {Max X Y} if X>=Y then X else Y proc {Max X Y R} R = ( if X>=Y then X else Y ) proc {Max X Y R} if X>=Y then R = X else R = Y C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 32

andthen and orelse expr 1 andthen expr 2 if expr 1 then expr 2 else false expr 1 orelse expr 2 if expr 1 then true else expr 2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 33

Function calls Observe {F1 {F2 X} {F3 Y}} local R1 R2 in R1 = {F2 X} R2 = {F3 Y} {F1 R1 R2} The arguments of a function are evaluated first from left to right C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 34

A complete example fun {Map Xs F} case Xs of nil then nil [] X Xr then {F X} {Map Xr F} proc {Map Xs F Ys} case Xs of nil then Ys = nil [] X Xr then Y Yr in Ys = Y Yr {F X Y} {Map Xr F Yr} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 35

Exceptions How to handle exceptional situations in the program? Examples: divide by 0 opening a nonexistent file Some errors are programming errors Some errors are imposed by the external environment Exception handling statements allow programs to handle and recover from errors C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 36

Exceptions The error confinement principle: Define your program as a structured layers of components Errors are visible only internally and a recovery procedure corrects the errors: either errors are not visible at the component boundary or are reported (nicely) to a higher level In one operation, exit from arbitrary depth of nested contexts Essential for program structuring; else programs get complicated (use boolean variables everywhere, etc.) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 37

Basic concepts A program that encounters an error (exception) should transfer execution to another part, the exception handler and give it a (partial) value that describes the error try s 1 catch x then s 2 raise x Introduce an exception marker on the semantic stack The execution is equivalent to s 1 if it executes without raising an error Otherwise, s 1 is aborted and the stack is popped up to the marker, the error value is transferred through x, and s 2 is executed C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 38

Exceptions (Example) fun {Eval E} if {IsNumber E} then E else case E of plus(x Y) then {Eval X}+{Eval Y} [] times(x Y) then {Eval X}*{Eval Y} else raise illformedexpression(e) plus times 5 6 4 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 39

Exceptions (Example) try {Browse {Eval plus(5 6) }} {Browse {Eval plus(times(5 5) 6) }} {Browse {Eval plus(minus(5 5) 6) }} catch illformedexpression(e) then {System.showInfo **** illegal expresion **** # E} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 40

Try semantics The semantic statement is (try s 1 catch y then s 2, E) Push the semantic statement (catch y then s 2, E) on ST Push ( s 1, E) on ST Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 41

Raise semantics The semantic statement is (raise x, E) Pop elements off ST looking for a catch statement: If a catch statement is found, pop it from the stack If the stack is emptied and no catch is found, then stop execution with the error message Uncaught exception Let (catch y then s, E c ) be the catch statement that is found Push ( s, E c +{<y> E(<x>)}) on ST Continue to next execution step C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 42

Catch semantics The semantic statement is (catch x then s, E) Continue to next execution step (like skip) C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 43

Full exception syntax Exception statements (expressions) with multiple patterns and finally clause Example: : FH = {OpenFile xxxxx } : try {ProcessFile FH} catch X then {System.showInfo ***** Exception when processing ***** # X} finally {CloseFile FH} C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 44

finally syntax try s 1 finally s 2 is converted to: try s 1 catch X then s 2 raise X s 2 C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 45

Case statement revisited The semantic statement is ( case x of l ( f 1 : x 1 f n : x n ) then s 1 else s 2, E) If the activation condition (E( x ) is determined) is true: If E( x ) is a record, the label of E( x ) is l and its arity is [ f 1 f n ]: push (try local x 1 = x. f 1 x n = x. f n in s 1 * catch user(e) then raise E [] E then s 2, E) on the stack, where s 1 * is the same as s 1 except raise E is changed to raise user(e) Otherwise, push ( s 2, E) on the stack If the activation condition (E( x ) is determined) is false: Susp C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 46

Exercises 49. VRH Exercise 2.9.3 (page 107). 50. VRH Exercise 2.9.7 (page 108) translate example to kernel language and execute using operational semantics. 51. Write an example of a program that susps. Now, write an example of a program that never terminates. Use the operational semantics to prove suspension or nontermination. 52. VRH Exercise 2.9.12 (page 110). 53. Change the semantics of the case statement, so that patterns can contain variable labels and variable feature names. C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 47

Exercises 54. Restrict the kernel language to make it strictly functional (i.e., without dataflow variables) Language similar to Scheme (dynamically typed functional language) This is done by disallowing variable declaration (without initialization) and disallowing procedural syntax Only use implicit variable initialization Only use functions C. Varela; Adapted w/permission from S. Haridi and P. Van Roy 48