Note: These instructions will be unnecessary after Agda 2.6.0 is released.
- Clone the Agda repository.
git clone https://github.com/agda/agda.git cd agda
module Termination where | |
open import Data.Maybe | |
open import Data.Sum | |
data Unit : Set where | |
unit : Unit | |
record Stream : Set where | |
coinductive |
*Note*: I will call this ~sprintf~ instead of ~printf~ since we are not dealing with IO. | |
I will use the terminology from the [[https://linux.die.net/man/3/fprintf][man page for ~sprintf~]]. | |
~sprintf~ takes a "format string" which is any number of "directives". | |
A directive is either a character other than ~'%'~ or a "conversion specification" consisting of a ~'%'~ and conversion specifier (such as ~d~ for integers). | |
The design chosen during lecture failed since our level of abstraction was at characters instead of directives. | |
For instance, the string ~"%d"~ has two characters but only a single directive: the integer conversion specification. | |
We can start with a data type to represent directives. |
open import Relation.Binary.PropositionalEquality renaming (refl to definition-chasing) | |
open ≡-Reasoning | |
open import Agda.Builtin.String | |
open import Function | |
defn-chasing : ∀ {i} {A : Set i} (x : A) → String → A → A | |
defn-chasing x reason supposedly-x-again = supposedly-x-again | |
syntax defn-chasing x reason xish = x ≡⟨ reason ⟩′ xish | |
infixl 3 defn-chasing |
Note: These instructions will be unnecessary after Agda 2.6.0 is released.
git clone https://github.com/agda/agda.git cd agda
# Abstract Data Type | |
class PointT: | |
def __init__(self, x, y): | |
self.__point = (x, y) | |
# sum : PointT -> R | |
# sum is an instance method. | |
# It acts on one instance. | |
# In Python we call an instance an object. | |
# An object from the class PointT is an object |
open import Data.Bool | |
open import Relation.Binary.PropositionalEquality renaming (refl to definition-chasing) | |
record List (A : Set) : Set where | |
-- Explicitly coinductive. | |
-- The fields of this record are the destructors of this coinductive type. | |
-- Notice: /No/ cons! | |
coinductive | |
field | |
car : A |
instance Arbitrary a => Arbitrary (Rose a) where | |
arbitrary = | |
let | |
numChildren :: Gen Int | |
numChildren = (`mod` 6) . abs <$> arbitrary | |
makeRose :: Arbitrary a => Int -> Gen (Rose a) | |
makeRose n = rose $ n `div` 2 | |
branch :: Arbitrary a => Int -> Gen [Rose a] |
TEST_CASE("Refraction straight through center from outside") { | |
Vec3f rayDirection({ 0, 0, -1 }); | |
Vec3f normal({ 0, 0, 1 }); | |
bool isTotalInternalReflection; | |
Vec3f refraction = refractionDir(rayDirection, normal, 1.2f, isTotalInternalReflection); | |
REQUIRE(refraction[0] == 0); | |
REQUIRE(refraction[1] == 0); | |
REQUIRE(refraction[2] == -1); | |
REQUIRE(!isTotalInternalReflection); | |
} |
uint8_t byteRead; | |
uint8_t byteIndex; | |
uint8_t checksum; | |
uint8_t buttonNum; | |
bool buttonVal; | |
bool validState; | |
void loop() { | |
t = millis(); |
Axiom “Demo”: Q ⇒ P | |
Theorem “Contrapositivity is the antitonicity of logical not”: ¬ P ⇒ ¬ Q | |
Proof: | |
¬ P | |
⇒⟨ “Contrapositive” with “Demo” ⟩ | |
¬ Q |