Systém F ( polymorfní počet lambda , systém , typovaný počet lambda druhého řádu ) je typovaný systém počtu lambda , který se liší od jednoduše typovaného systému přítomností univerzálního kvantifikačního mechanismu nad typy. Tento systém vyvinul v roce 1972 Jean-Yves Girard [1] v kontextu teorie důkazů v logice. Nezávisle na něm podobný systém navrhl v roce 1974 John Reynolds [2] . Systém F vám umožňuje formalizovat koncept parametrického polymorfismu v programovacích jazycích a slouží jako teoretický základ pro takové programovací jazyky, jako jsouHaskell a ML .
Systém F umožňuje konstrukci termínů v závislosti na typech. Technicky je toho dosaženo mechanismem abstrahování termínu podle typu, což vede k novému termínu. Tradičně se pro takovou abstrakci používá velký symbol lambda . Například, vezmeme-li výraz typu a abstrahujeme proměnnou typu , získáme term . Tento termín je funkcí od typů k termínům. Aplikací této funkce na různé typy získáme termíny se stejnou strukturou, ale různými typy:
- termín typu ; je termín typu .Je vidět, že termín má polymorfní chování, to znamená, že definuje společné rozhraní pro různé datové typy. V systému F je tomuto termínu přiřazen typ . Univerzální kvantifikátor v typu zdůrazňuje možnost nahrazení typové proměnné jakýmkoli platným typem .
Typy systému F jsou konstruovány ze sady typových proměnných pomocí operátorů a . Podle tradice se pro typové proměnné používají řecká písmena. Pravidla pro formování typů jsou následující:
Vnější závorky jsou často vynechány, operátor je považován za asociativní vpravo a akce operátoru pokračuje doprava, pokud je to možné. Například je standardní zkratka pro .
Termíny systému F jsou konstruovány ze sady termínových proměnných ( , atd .) podle následujících pravidel
Vnější závorky jsou často vynechány, oba druhy použití jsou považovány za asociativní vlevo a akce abstrakce se považuje za pokračování doprava, pokud je to možné.
Existují dvě verze jednoduchého systému. Pokud, jako ve výše uvedených pravidlech, jsou termínové proměnné v lambda abstrakci označeny typy, pak je systém označován jako Church-typed . Pokud je pravidlo abstrakce nahrazeno
a zahoďte poslední dvě pravidla, pak se systém nazývá Curry-typed . Ve skutečnosti jsou podmínky Curry-typizovaného systému stejné jako ty v netypizovaném lambda kalkulu.
Kromě standardního -redukčního pravidla pro lambda kalkul
Kostelní systém F zavádí další pravidlo,
,umožňující vypočítat aplikaci termínu na typ pomocí mechanismu substituce typu namísto typové proměnné.
Kontext, stejně jako v jednoduše zadaném lambda kalkulu , je soubor příkazů o přiřazování typů různým proměnným, oddělených čárkou
Pro tento kontext můžete do kontextu přidat proměnnou „fresh“: pokud je platný kontext, který neobsahuje proměnnou , a je to typ, pak je to také platný kontext.
Obecná forma typizačního příkazu je:
To zní následovně: v kontextu má výraz typ .
V Churchově typizovaném systému F se přiřazování typů termínům provádí podle následujících pravidel:
( Počáteční pravidlo ) Pokud je proměnná přítomna s typem v kontextu , pak má typ v tomto kontextu . Ve formě inferenčního pravidla
( Úvodní pravidlo ) Jestliže v nějakém kontextu rozšířeném o příkaz, který má typ , má výraz typ , pak v uvedeném kontextu (bez ) má abstrakce lambda typ . Ve formě inferenčního pravidla
( pravidlo odstranění ) Pokud má v nějakém kontextu termín typ a termín má typ , pak má typ aplikace . Ve formě inferenčního pravidla
( Úvodní pravidlo ) Jestliže v nějakém kontextu má termín typ , pak v tomto kontextu má termín typ . Ve formě inferenčního pravidla
Toto pravidlo vyžaduje upozornění: typová proměnná se nesmí vyskytovat v výrazech pro zadávání kontextu .
( pravidlo odstranění ) Pokud má v nějakém kontextu výraz typ , a je typem, pak v tomto kontextu má výraz typ . Ve formě inferenčního pravidla
V systému F typu Curry se přiřazování typů termínům provádí podle následujících pravidel:
( Počáteční pravidlo ) Pokud je proměnná přítomna s typem v kontextu , pak má typ v tomto kontextu . Ve formě inferenčního pravidla
( Úvodní pravidlo ) Jestliže v nějakém kontextu rozšířeném o příkaz, který má typ , má výraz typ , pak v uvedeném kontextu (bez ) má abstrakce lambda typ . Ve formě inferenčního pravidla
( pravidlo odstranění ) Pokud má v nějakém kontextu termín typ a termín má typ , pak má typ aplikace . Ve formě inferenčního pravidla
( Úvodní pravidlo ) Pokud má termín v nějakém kontextu typ , pak v tomto kontextu lze tomuto termínu také přiřadit typ . Ve formě inferenčního pravidla
Toto pravidlo vyžaduje upozornění: typová proměnná se nesmí vyskytovat v výrazech pro zadávání kontextu .
( pravidlo odstranění ) Pokud má v nějakém kontextu výraz typ , a je typem, pak v tomto kontextu lze tomuto výrazu přiřadit také typ . Ve formě inferenčního pravidla
Příklad. Podle původního pravidla:
Použijme pravidlo odebrání , přičemž jako typ
Nyní, v souladu s pravidlem odebrání , máme možnost použít termín na sebe sama
a konečně podle pravidla úvodu
Toto je příklad výrazu zadávaného v systému F, ale ne v jednoduše zadávaném systému .
Systém F je dostatečně expresivní, aby přímo implementoval mnoho datových typů používaných v programovacích jazycích. Budeme pracovat v Churchově verzi systému F.
Prázdný typ. Typ
je v systému F neobydlený, to znamená, že v něm nejsou žádné termíny s tímto typem.
Jediný typ. Typ Y
systém F má jednoho normálního obyvatele, člen
.booleovský typ. V systému F je dáno následovně:
.Tento typ má přesně dva obyvatele identifikované dvěma booleovskými konstantami
Konstrukce podmíněného operátoru
Tato funkce splňuje přirozené požadavky
a
pro libovolný typ a libovolný a . Je snadné to ověřit rozšířením definic a provedením -redukce.
Typ uměleckého díla. Pro libovolné typy a typ jejich kartézského součinu
obývá pár
pro každého a . Projekce dvojice jsou dány funkcemi
Tyto funkce splňují přirozené požadavky a .
Typ částky. Pro libovolné typy a typ jejich součtu
vyplněno buď termínem typu , nebo termínem typu , v závislosti na použitém konstruktoru
Zde , . Funkce, která provádí analýzu velkých a malých písmen (pattern matching) má tvar
Tato funkce splňuje následující přirozené požadavky
a
pro libovolné typy a libovolné termíny a .
Kostelní čísla. Typ přirozených čísel v soustavě F
obývá nekonečné množství různých prvků, získaných prostřednictvím dvou konstruktérů a :
Přirozené číslo lze získat aplikací druhého konstruktoru - krát na první, nebo ekvivalentně reprezentované výrazem
Všimněte si, že korespondence Curry-Howard přiřazuje true jeden typ, false prázdný typ, spojuje součin typů a odděluje jejich součet.