• Nu S-Au Găsit Rezultate

Functional Equivalence

N/A
N/A
Protected

Academic year: 2022

Share "Functional Equivalence"

Copied!
49
0
0

Text complet

(1)

Operationally-based Program Equivalence Proofs using LCTRSs

S,tefan Ciobˆac˘a Dorel Lucanu Andrei Sebastian Buruian˘a [email protected]

[email protected] [email protected]

Alexandru Ioan Cuza University

WPTE 2021

(2)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

(3)

Functional Equivalence

Given two programsP andQ:

•do they compute the same output for the same input?

Many applications:

1 Compilation;

2 Optimizations;

3 Refinements.

Many approaches, usually based on Relational Hoare Logic. Fewer results in the area ofoperationally-based equivalence:

•GivenP (in a languageL1) andQ (in a languageL2), isP equivalent toQ?

(4)

Functional Equivalence

Given two programsP andQ:

•do they compute the same output for the same input?

Many applications:

1 Compilation;

2 Optimizations;

3 Refinements.

Many approaches, usually based on Relational Hoare Logic. Fewer results in the area ofoperationally-based equivalence:

•GivenP (in a languageL1) andQ (in a languageL2), isP equivalent toQ?

(5)

Functional Equivalence

Given two programsP andQ:

•do they compute the same output for the same input?

Many applications:

1 Compilation;

2 Optimizations;

3 Refinements.

Many approaches, usually based on Relational Hoare Logic.

Fewer results in the area ofoperationally-based equivalence:

•GivenP (in a languageL1) andQ (in a languageL2), isP equivalent toQ?

(6)

Functional Equivalence

Given two programsP andQ:

•do they compute the same output for the same input?

Many applications:

1 Compilation;

2 Optimizations;

3 Refinements.

Many approaches, usually based on Relational Hoare Logic.

Fewer results in the area ofoperationally-based equivalence:

•GivenP (in a languageL1) andQ (in a languageL2), isP equivalent toQ?

(7)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

6 Discussion

(8)

Logically Constrained Term Rewriting Systems

LCTRSshave rewrite rules of the form

l−→rifφ, wherel,r are terms;φis a logical constraint.

terms can containinterpretedsymbols.

Example

init(n)−→loop(n,2) if>, loop(i×k,i)−→comp ifk>1,

loop(n,i)−→loop(n,i+ 1) if¬(∃k.k>1∧n=i×k).

LCTRSs are parametric in a theory (such as LIA, RA, BV, Theory of Arrays, etc.).

(9)

Logically Constrained Term Rewriting Systems

LCTRSshave rewrite rules of the form

l−→rifφ, wherel,r are terms;φis a logical constraint.

terms can containinterpretedsymbols.

Example

init(n)−→loop(n,2) if>, loop(i×k,i)−→comp ifk>1,

loop(n,i)−→loop(n,i+ 1) if¬(∃k.k>1∧n=i×k).

LCTRSs are parametric in a theory (such as LIA, RA, BV, Theory of Arrays, etc.).

(10)

Logically Constrained Term Rewriting Systems

LCTRSshave rewrite rules of the form

l−→rifφ, wherel,r are terms;φis a logical constraint.

terms can containinterpretedsymbols.

Example

init(n)−→loop(n,2) if>, loop(i×k,i)−→comp ifk>1,

loop(n,i)−→loop(n,i+ 1) if¬(∃k.k>1∧n=i×k).

LCTRSs are parametric in a theory (such as LIA, RA, BV, Theory of Arrays, etc.).

(11)

Syntax of Programming Language as Order-Sorted Signatures

Exp ::= Int|Bool|Id|ExpbinopExp|unopExp|call FunCall|skip| Exp;Exp|Id:=Exp|while Exp do Exp|if Exp then Exp else Exp FunCall ::= Id|FunCall(Exp)

FunBody ::= Exp|λId.FunBody Stack ::= []|Exp Stack Cfg ::= hStack,Env,Funcsi Env ::= Array{Int}{Int}

Funcs ::= Array{Id}{FunBody}

•Sorts are the nonterminals.

•Language constructs are operations.

•The distinguished sortCfgis the sort ofprogram configurations.

(12)

Syntax of Programming Language as Order-Sorted Signatures

Exp ::= Int|Bool|Id|ExpbinopExp|unopExp|call FunCall|skip| Exp;Exp|Id:=Exp|while Exp do Exp|if Exp then Exp else Exp FunCall ::= Id|FunCall(Exp)

FunBody ::= Exp|λId.FunBody Stack ::= []|Exp Stack Cfg ::= hStack,Env,Funcsi Env ::= Array{Int}{Int}

Funcs ::= Array{Id}{FunBody}

•Sorts are the nonterminals.

•Language constructs are operations.

•The distinguished sortCfgis the sort ofprogram configurations.

(13)

Syntax of Programming Language as Order-Sorted Signatures

Exp ::= Int|Bool|Id|ExpbinopExp|unopExp|call FunCall|skip| Exp;Exp|Id:=Exp|while Exp do Exp|if Exp then Exp else Exp FunCall ::= Id|FunCall(Exp)

FunBody ::= Exp|λId.FunBody Stack ::= []|Exp Stack Cfg ::= hStack,Env,Funcsi Env ::= Array{Int}{Int}

Funcs ::= Array{Id}{FunBody}

•Sorts are the nonterminals.

•Language constructs are operations.

•The distinguished sortCfgis the sort ofprogram configurations.

(14)

Syntax of Programming Language as Order-Sorted Signatures

Exp ::= Int|Bool|Id|ExpbinopExp|unopExp|call FunCall|skip| Exp;Exp|Id:=Exp|while Exp do Exp|if Exp then Exp else Exp FunCall ::= Id|FunCall(Exp)

FunBody ::= Exp|λId.FunBody Stack ::= []|Exp Stack Cfg ::= hStack,Env,Funcsi Env ::= Array{Int}{Int}

Funcs ::= Array{Id}{FunBody}

•Sorts are the nonterminals.

•Language constructs are operations.

•The distinguished sortCfgis the sort ofprogram configurations.

(15)

Operational Semantics (in Frame Stack Style) (1/2)

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e) assignment hi x:= es,env,fsi−→hx:=i es,env,fsi

hx:=i es,env,fsi−→hes,update(env,x,i),fsi

hx es,env,fsi−→hlookup(x,env) es,env,fsi identifier lookup he1+e2 es,env,fsi−→he1 +e2 es,env,fsiif¬val(e1) binary hi1 +e2 es,env,fsi−→hi1+e2 es,env,fsi operations hi1+e2 es,env,fsi−→he2 i1+ es,env,fsiif¬val(e2)

hi2 i1+ es,env,fsi−→hi1+i2 es,env,fsi hi1+i2 es,env,fsi−→hi1+i2 es,env,fsi

hnote es,env,fsi−→he not es,env,fsiif¬val(e) unary hb not es,env,fsi−→hnotb es,env,fsi operations hnotb es,env,fsi−→hb es,env,fsi

hif>thene2elsee3 es,env,fsi−→he2 es,env,fsi if-then-else hif⊥thene2elsee3 es,env,fsi−→he3 es,env,fsi

hife1thene2elsee3 es,env,fsi−→he1 ifthene2elsee3 es,env,fsi if¬val(e1) hb ifthene2elsee3 es,env,fsi−→hifbthene2elsee3 es,env,fsi hwhilee1doe2 es,env,fsi−→ while loop

hife1then(e2; whilee1doe2)else skip es,env,fsi

he1;e2 es,env,fsi−→he1 e2 es,env,fsi sequence hskip es,env,fsi−→hes,env,fsi skip

(16)

Operational Semantics (in Frame Stack Style) (2/2)

hcallf es,env,fsi−→hlookup(f,fs) es,env,fsi function calls hcallf(e) es,env,fsi−→hcallf call(e) es,env,fsi

hλx.fb call(e) es,env,fsi−→hcallλx.fb(e) es,env,fsi

hcallλx.fb(e) es,env,fsi−→he callλx.fb() es,env,fsiif¬val(e)

hi callλx.fb() es,env,fsi−→hcallλx.fb(i) es,env,fsi

hcallλx.fb(i) es,env,fsi−→hsubst(x,i,fb) es,env,fsi

(17)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→ h[x,+2,x:=],env,fsi −→ h[12,+2,x:=],env,fsi −→ h[12+2,x:=],env,fsi −→ h[14,x:=],env,fsi −→ h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(18)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→ h[12,+2,x:=],env,fsi −→ h[12+2,x:=],env,fsi −→ h[14,x:=],env,fsi −→ h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(19)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→ h[12+2,x:=],env,fsi −→ h[14,x:=],env,fsi −→ h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(20)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→

h[12+2,x:=],env,fsi −→ h[14,x:=],env,fsi −→ h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(21)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→

h[12+2,x:=],env,fsi −→

h[14,x:=],env,fsi −→ h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(22)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→

h[12+2,x:=],env,fsi −→

h[14,x:=],env,fsi −→

h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(23)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→

h[12+2,x:=],env,fsi −→

h[14,x:=],env,fsi −→

h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(24)

Example Execution

h[x:=x+2],env,fsi −→

h[x+2,x:=],env,fsi −→

h[x,+2,x:=],env,fsi −→

h[12,+2,x:=],env,fsi −→

h[12+2,x:=],env,fsi −→

h[14,x:=],env,fsi −→

h[x:=14],env,fsi −→

h[],update(env,x,14),fsi 6−→.

(25)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

6 Discussion

(26)

Defining Program Equivalence. The Case for Base Cases

A difficulty in defining program equivalence in a language parametric setting is that different languages may store theoutput(the result) in different places:

h[s:=f(5) + 2],env,fsi−→ ..

.

h[],update(env,s,42),fsi6−→.

hlet x = f(5) in x + 2i−→ ..

. 426−→.

We parametrize in the set of base case: we letBbe pairs of terminal configurations that are considered equivalent.

(27)

Defining Program Equivalence. The Case for Base Cases

A difficulty in defining program equivalence in a language parametric setting is that different languages may store theoutput(the result) in different places:

h[s:=f(5) + 2],env,fsi−→

.. .

h[],update(env,s,42),fsi6−→.

hlet x = f(5) in x + 2i−→

.. . 426−→.

We parametrize in the set of base case: we letBbe pairs of terminal configurations that are considered equivalent.

(28)

Defining Program Equivalence. The Case for Base Cases

A difficulty in defining program equivalence in a language parametric setting is that different languages may store theoutput(the result) in different places:

h[s:=f(5) + 2],env,fsi−→

.. .

h[],update(env,s,42),fsi6−→.

hlet x = f(5) in x + 2i−→

.. . 426−→.

We parametrize in the set of base case: we letBbe pairs of terminal configurations that are considered equivalent.

(29)

Simulations between Program Configurations

Given: Two operational semanticsRL andRR; the sorts CfgL and CfgR.

Definition (Full (Partial) Simulation)

A symbolic program configurationP is fully (partially) simulated by a symbolic program configuration Q under constraintφwith a set of base casesB, written

BP≺Qifφ (BPQifφ),

if, for any valuationρsuch thatρ(φ) =>and for any complete pathρ(P)−→RLP0, there exists a complete pathρ(Q)−→RR Q0 such that (P0,Q0)∈B(or – for partial simulation only – there exists an infinite pathρ(Q)−→RR . . .);

(30)

Program Equivalence

Definition (Full (Partial) Equivalence)

Two symbolic program configurationsPandQ arefully equivalent (partially equivalent) under constraintφwith a set of base casesB, written

BP∼Qifφ (BP'Qifφ),

ifBP≺QifφandB−1Q≺Pifφ(BPQifφandB−1QPifφ).

(31)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

6 Discussion

(32)

Basic Idea

We prove equivalence by two-sided simulation.

To proveP..Q ifφ, we construct a set G of goals such that:

1 P..Qifφ∈G;

2 G may contain other helper goals (lemmas). We provide a sound proof system:

Theorem (Soundness for full/partial simulation)

If G,B`0G andJBK⊆B, then for any simulation formula P..Qifφ∈G, we have that

BP..Qifφ.

(33)

Basic Idea

We prove equivalence by two-sided simulation.

To proveP..Q ifφ, we construct a set G of goals such that:

1 P..Qifφ∈G;

2 G may contain other helper goals (lemmas).

We provide a sound proof system:

Theorem (Soundness for full/partial simulation)

If G,B`0G andJBK⊆B, then for any simulation formula P..Qifφ∈G, we have that

BP..Qifφ.

(34)

Basic Idea

We prove equivalence by two-sided simulation.

To proveP..Q ifφ, we construct a set G of goals such that:

1 P..Qifφ∈G;

2 G may contain other helper goals (lemmas).

We provide a sound proof system:

Theorem (Soundness for full/partial simulation)

If G,B `0G andJBK⊆B, then for any simulation formula P..Qifφ∈G, we have that

BP..Qifφ.

(35)

Proof System for Simulation

Notation: sub

(P,Q),R ,W

P0..Q0ifφ0∈R∃var(P0,Q0, φ0).(φ0∧P=P0∧Q=Q0) Axiom

G,B`gP..Qif⊥ Base

G,B`gP..Qifφ∧ ¬φB

G,B`g P..Qifφ φB W

Q0ifφ0∈∆≤kR

R(Q) φ0→sub

(P,Q0),B

Circ

G,B`1P≺Qifφ∧ ¬φG

G,B `1P≺Qifφ φG W

Q0ifφ0∈∆≤kR

R(Q) φ0→sub

(P,Q0),G

Circ

G,B`g PQifφ∧ ¬φG

G,B`gPQifφ φG W

Q0ifφ0∈∆≥1−g,≤kR

R (Q)

φ0→sub

(P,Q0),G

Step

G,B`1Pi..Qifφi (for all 1≤i≤n) G,B`g P..Qifφ∧ ¬φ1∧. . .∧ ¬φn

G,B`g P..Qifφ RL(Pifφ)={P

i ifφi|1in}

(36)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

(37)

Setting Resource Bounds

Let us assume that we are interested in interpretingWHprograms on a finite-stack machine.

Initial rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e) Updated rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e)∧len(es)<k

| {z }

new constraint

Call the initial languageWH1and the finite-stack languageWH2.

(38)

Setting Resource Bounds

Let us assume that we are interested in interpretingWHprograms on a finite-stack machine.

Initial rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e)

Updated rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e)∧len(es)<k

| {z }

new constraint

Call the initial languageWH1and the finite-stack languageWH2.

(39)

Setting Resource Bounds

Let us assume that we are interested in interpretingWHprograms on a finite-stack machine.

Initial rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e) Updated rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e)∧len(es)<k

| {z }

new constraint

Call the initial languageWH1and the finite-stack languageWH2.

(40)

Setting Resource Bounds

Let us assume that we are interested in interpretingWHprograms on a finite-stack machine.

Initial rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e) Updated rewrite rule:

hx:=e es,env,fsi−→he x:= es,env,fsiif¬val(e)∧len(es)<k

| {z }

new constraint

Call the initial languageWH1and the finite-stack languageWH2.

(41)

Equivalence in the Presence of Resource Bounds

We study using our method the equivalence inWH1andWH2of the programs:

h[call f(N)],env,fsi and h[call F(N,0,0)],env,fsi

forN≥0, where the recursive functionsf andFare defined by the function map fs={f 7→λn.if n = 0 then 0 else n+call f(n−1),

F7→λn.λi.λa.if i≤n then call F(n,i+1,a+i) else a}.

(42)

The functions f and F

exp.

phase





h[f(3)]i −→

h[f(2),3+]i −→ h[f(1),2+,3+]i −→ h[f(0),1+,2+,3+]i −→ contr.

phase





h[0,1+,2+,3+]i −→ h[1,2+,3+]i −→ h[3,3+]i −→

h[6]i 6−→

h[F(3,0,0)]i −→ h[F(3,1,0)]i −→ h[F(3,2,1)]i −→ h[F(3,3,3)]i −→ h[F(3,4,6)]i −→ h[6]i 6−→

(43)

Equivalence in the Presence of Resource Bounds

We letB={(h[i],env,fsi,h[i0],env0,fs0i)|i=i0∧i,i0∈Z}.

G ={

h[call f(N)],env,fsi .. h[call F(N,0,0)],env,fsi if 0≤N, hcall f(I−1) reduce(I,N),env,fsi .. h[call F(N,0,0)],env,fsi if 0≤I≤N, hS reduce(I,N),env,fsi .. h[call F(N,I,S)],env,fsi if 1≤I≤N}, where

reduce(i,n)−→[] ifi>n,

reduce(i,n)−→(i+) reduce(i+1,n) if i≤n. Using the setsG,B defined above, we have that

G,B`0G for partial and full simulation and that

G−1,B−1`0G−1 for partial simulation. Our proof system cannot showG−1,B−1`0G−1for technical reasons.

So we prove partial equivalence betweenf andF, but only part of the full equivalence betweenf andF.

(44)

Equivalence in the Presence of Resource Bounds

We letB={(h[i],env,fsi,h[i0],env0,fs0i)|i=i0∧i,i0∈Z}.

G={

h[call f(N)],env,fsi .. h[call F(N,0,0)],env,fsi if 0≤N, hcall f(I−1) reduce(I,N),env,fsi .. h[call F(N,0,0)],env,fsi if 0≤I≤N, hS reduce(I,N),env,fsi .. h[call F(N,I,S)],env,fsi if 1≤I≤N}, where

reduce(i,n)−→[] ifi>n,

reduce(i,n)−→(i+) reduce(i+1,n) if i≤n.

Using the setsG,B defined above, we have that

G,B`0G for partial and full simulation and that

G−1,B−1`0G−1 for partial simulation. Our proof system cannot showG−1,B−1`0G−1for technical reasons.

So we prove partial equivalence betweenf andF, but only part of the full equivalence betweenf andF.

(45)

Equivalence in the Presence of Resource Bounds

We letB={(h[i],env,fsi,h[i0],env0,fs0i)|i=i0∧i,i0∈Z}.

G={

h[call f(N)],env,fsi .. h[call F(N,0,0)],env,fsi if 0≤N, hcall f(I−1) reduce(I,N),env,fsi .. h[call F(N,0,0)],env,fsi if 0≤I≤N, hS reduce(I,N),env,fsi .. h[call F(N,I,S)],env,fsi if 1≤I≤N}, where

reduce(i,n)−→[] ifi>n,

reduce(i,n)−→(i+) reduce(i+1,n) if i≤n.

Using the setsG,B defined above, we have that

G,B`0G for partial and full simulation and that

G−1,B−1`0G−1 for partial simulation.

Our proof system cannot showG−1,B−1`0G−1for technical reasons.

So we prove partial equivalence betweenf andF, but only part of the full equivalence betweenf andF.

(46)

Equivalence in the Presence of Resource Bounds

We letB={(h[i],env,fsi,h[i0],env0,fs0i)|i=i0∧i,i0∈Z}.

G={

h[call f(N)],env,fsi .. h[call F(N,0,0)],env,fsi if 0≤N, hcall f(I−1) reduce(I,N),env,fsi .. h[call F(N,0,0)],env,fsi if 0≤I≤N, hS reduce(I,N),env,fsi .. h[call F(N,I,S)],env,fsi if 1≤I≤N}, where

reduce(i,n)−→[] ifi>n,

reduce(i,n)−→(i+) reduce(i+1,n) if i≤n.

Using the setsG,B defined above, we have that

G,B`0G for partial and full simulation and that

G−1,B−1`0G−1 for partial simulation.

(47)

Outline

1 Motivation

2 Operational Semantics as LCTRSs LCTRSs

Syntax Semantics Example

3 Defining Program Equivalence

4 Proving Equivalence

5 Application

6 Discussion

(48)

Implementation

Prototype implementation of the two proof systems in theRMTtool at:

http://profs.info.uaic.ro/~stefan.ciobaca/wpte2021.

Example Ctrl RMT

fib02 4.02s 25.73s

fib03 3.06s 27.55s

fib04 Timeout 77.40s

fib05 3.99s 36.67s

fib06 32.81s 63.39s

fib07 2.74s 59.31s

fib08 3.44s 60.77s

fib09 3.09s 41.51s

fib10 2.34s 35.91s

fib11 Timeout 79.52s

fib12 No No

sum01 2.39s 10.51s

sum02 2.33s 12.36s

sum03 2.62s 12.30s

Optimization PEC CORK RMT

Code hoisting X 0.32s 0.41s

Constant propagation X 0.33s 0.31s

Copy propagation X 0.33s 0.26s

If-conversion X 0.34s 0.48s

Partial redundancy elimination X 0.34s 0.75s

Loop invariant code motion X 3.48s 3.79s

Loop peeling X 3.26s 0.97s

Loop unrolling X 12.17s 7.09s

Loop unswitching X 8.19s 4.71s

Software pipelining X 8.02s 3.56s

Loop fission X 23.45s 10.40s

Loop fusion X 23.34s 9.67s

Loop interchange X 29.30s 108.63s

Loop reversal X 8.41s 2.70s

Loop skewing X 8.50s 7.68s

Loop flattening × × 8.14s

(49)

Conclusion

1 Promising approach to operationally-based equivalence.

2 Requires extending LCTRSs withaxiomatized symbols(likereduce), which raise new research questions (unification modulo axiomatized symbols).

3 Our approach allows for nondeterminism in the definitions and proofs of equivalence, and we will exploit this in future work.

Thank you!

Referințe

DOCUMENTE SIMILARE

The chain of narrative segments develops along the external division of six chapters a retrospective story – a left- hand written diary – where Abel writes his memories

It will also discuss several free trade agreements that are in effect in the region as well as efforts by the country to join the Trans-Pacific Partnership (TPP) and the

“Given that the higher education sector is situated at the crossroads of research, education and innovation, it is a central player in the knowledge economy and society and key to

The first theme, Efficient and interoperable eGovernment services, aims at improving the efficiency and effectiveness of public administrations and facilitating their interactions

Member States have committed themselves to inclusive eGovernment objectives to ensure that by 2010 all citizens, including socially disadvantaged groups, become major beneficiaries

Haskell is a general purpose, purely functional programming language exhibiting many of the recent innovations in functional (as well as other) programming language re-

the anthropology of senses, in which it is argued that cultures value the types of perception in a different manner: while in Indo-European languages (including Romanian) visual

This classification allows stating an important correlation between the denotation of the adjective and its syntax (for a more detailed analysis, see Cornilescu