<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2405446824614547939</id><updated>2011-11-14T15:56:05.909-08:00</updated><title type='text'>Vag's List</title><subtitle type='html'>List of random ideas in programming/CS.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-3774982907498867056</id><published>2011-10-27T10:53:00.000-07:00</published><updated>2011-10-27T10:53:55.194-07:00</updated><title type='text'>Death of Rabbit (17350)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ZqjT0k498xw/TqmakJpsNNI/AAAAAAAAAEI/JonShiGKGxM/s1600/rabbit_death.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://3.bp.blogspot.com/-ZqjT0k498xw/TqmakJpsNNI/AAAAAAAAAEI/JonShiGKGxM/s320/rabbit_death.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-3774982907498867056?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/3774982907498867056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=3774982907498867056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/3774982907498867056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/3774982907498867056'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2011/10/death-of-rabbit-17350.html' title='Death of Rabbit (17350)'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-ZqjT0k498xw/TqmakJpsNNI/AAAAAAAAAEI/JonShiGKGxM/s72-c/rabbit_death.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-8757858392088236876</id><published>2010-03-11T06:40:00.000-08:00</published><updated>2011-03-08T02:11:49.879-08:00</updated><title type='text'>GHC DO syntax desugaring is very intuitive and conforming</title><content type='html'>&lt;pre&gt;{-# LANGUAGE NoImplicitPrelude #-} module Main where&lt;br /&gt;import Prelude (putStrLn, (+), (*), show)&lt;br /&gt;&lt;br /&gt;return a = a&lt;br /&gt;infix 1 &gt;&gt;=; a &gt;&gt;= b = b a&lt;br /&gt;infix 1 &gt;&gt;; a &gt;&gt; b = b a&lt;br /&gt;fail a = a&lt;br /&gt;fromInteger a = a&lt;br /&gt;&lt;br /&gt;test = do&lt;br /&gt;x &lt;- return 1&lt;br /&gt;y &lt;- return 2&lt;br /&gt;test2 x 10&lt;br /&gt;test3 y&lt;br /&gt;&lt;br /&gt;test2 a b = a + b&lt;br /&gt;test3 a b = a * b&lt;br /&gt;&lt;br /&gt;main = putStrLn (show test)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-8757858392088236876?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/8757858392088236876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=8757858392088236876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8757858392088236876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8757858392088236876'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2010/03/haskell-do-syntax-desugaring-is-very.html' title='GHC DO syntax desugaring is very intuitive and conforming'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-53432319054091167</id><published>2010-02-25T03:58:00.001-08:00</published><updated>2010-02-25T03:59:17.635-08:00</updated><title type='text'>Lazy list division (Haskell)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;firstHalf :: [a] -&gt; [a]&lt;br /&gt;firstHalf list0 = div list0 list0&lt;br /&gt;    where&lt;br /&gt;    div (a,b:arg) (r:res) = r:div arg res&lt;br /&gt;    div _ _ = []&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-53432319054091167?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/53432319054091167/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=53432319054091167' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/53432319054091167'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/53432319054091167'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2010/02/lazy-list-division-haskell.html' title='Lazy list division (Haskell)'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-2973729469278993387</id><published>2009-07-09T01:54:00.000-07:00</published><updated>2009-07-09T01:57:51.529-07:00</updated><title type='text'>Tiny proof assistant in Clean without Curry-Howard Isomorphism</title><content type='html'>&lt;pre&gt;&lt;br /&gt;module PublishND&lt;br /&gt;&lt;br /&gt;import StdGeneric, GenEq, StdMisc&lt;br /&gt;from StdEnv import&lt;br /&gt; instance == {#Char}, instance == Int, instance == Real,&lt;br /&gt; &amp;&amp;, class == (..), instance == [a] | == a&lt;br /&gt;&lt;br /&gt;Start = let p = pvar "P" in [notI2 p,notE2_nc p,notE3 p,notE3_nc p,errNotE2 p]&lt;br /&gt;where&lt;br /&gt; impOpen r p = impE r (assum p)&lt;br /&gt; mix a b&lt;br /&gt;  # r = andI a b&lt;br /&gt;  # r = andE r&lt;br /&gt;  = r&lt;br /&gt; mix` a b&lt;br /&gt;  # r = andI a b&lt;br /&gt;  # r = andE` r&lt;br /&gt;  = r&lt;br /&gt; /*&lt;br /&gt;        p, p -&gt; _|_ |- _|_&lt;br /&gt;  -----------------------------&lt;br /&gt;   p |- (p -&gt; _|_) -&gt; _|_&lt;br /&gt; */&lt;br /&gt; notI2 p&lt;br /&gt;  # a = assum p&lt;br /&gt;  # b = assum (p --&gt; B)&lt;br /&gt;  # r = mix` a b&lt;br /&gt;  # r = impOpen r p&lt;br /&gt;  # r = impI r (p --&gt; B)&lt;br /&gt;  = r&lt;br /&gt;&lt;br /&gt; /*&lt;br /&gt;  ~p,~~p |- ~p /\ ~~p&lt;br /&gt;  --------------- assum(~p),assum(~~p),andI,contra,absurd(p)&lt;br /&gt;   ~p&lt;br /&gt; */&lt;br /&gt; notE2_nc p // !!!!!! [!] !!!!!!!&lt;br /&gt;  # np = ~ p&lt;br /&gt;  # nnp = ~ np&lt;br /&gt;  # a = assum np&lt;br /&gt;  # b = assum nnp&lt;br /&gt;  # r = contra a b&lt;br /&gt;  # r = absurd r p&lt;br /&gt;  = r&lt;br /&gt;&lt;br /&gt; /*&lt;br /&gt;   P |- (P --&gt; _|_) --&gt; _|_&lt;br /&gt;   ((P --&gt; _|_) --&gt; _|_) --&gt; _|_ |- ((P --&gt; _|_) --&gt; _|_) --&gt; _|_&lt;br /&gt;   ((P --&gt; _|_) --&gt; _|_) --&gt; _|_, P |- _|_&lt;br /&gt;  -------------------------------------------------&lt;br /&gt;   ((P --&gt; _|_) --&gt; _|_) --&gt; _|_ |- P --&gt; _|_&lt;br /&gt; */&lt;br /&gt; notE3 p&lt;br /&gt;  # n3 = ((p --&gt; B) --&gt; B) --&gt; B&lt;br /&gt;  # a = notI2 p&lt;br /&gt;  # b = assum n3&lt;br /&gt;  # r = contra a b&lt;br /&gt;  # r = impI r p&lt;br /&gt;  = r&lt;br /&gt;&lt;br /&gt; notE3_nc p&lt;br /&gt;  # np = ~ p&lt;br /&gt;  # nnp = ~ np&lt;br /&gt;  # nnnp = ~ nnp&lt;br /&gt;  # a = assum nnp&lt;br /&gt;  # b = assum nnnp&lt;br /&gt;  # r = contra a b&lt;br /&gt;  # r = absurd r np&lt;br /&gt;  = r&lt;br /&gt;&lt;br /&gt; /* doubleNot:&lt;br /&gt;  ~~~p,p,... |- q /\ ~q&lt;br /&gt;  ------------- weak(p),contra,notI3,absurd&lt;br /&gt;   p |- ~~p&lt;br /&gt; */&lt;br /&gt; errNotE2 p&lt;br /&gt;  # np = ~ p&lt;br /&gt;  # nnp = ~ np&lt;br /&gt;  # nnnp = ~ nnp&lt;br /&gt;  # r = assum (nnp /\ nnnp)&lt;br /&gt;  # a = andE r&lt;br /&gt;  # b = andE` r&lt;br /&gt;  # r = contra a b&lt;br /&gt;  // r = absurd r nnp&lt;br /&gt;  = r&lt;br /&gt;&lt;br /&gt;pvar a = PV a&lt;br /&gt;tvar a = TV a&lt;br /&gt;&lt;br /&gt;/* ----------------- TCB (so must be in separate module with ::Deduced as abstract type ----------------------- */&lt;br /&gt;&lt;br /&gt;start =&gt; EMPTY |- T&lt;br /&gt;assum p =&gt; p$ EMPTY WITH p |- p&lt;br /&gt;weak (v |- p) q =&gt; q$ v WITH q |- p&lt;br /&gt;impI (v |- p) q | q IN v =&gt; q$ v WITHOUT q |- q --&gt; p&lt;br /&gt;impE (v |- p --&gt; q) (w |- p`) | p == p` =&gt; v AND w |- q&lt;br /&gt;andI (v |- p) (w |- q) =&gt; v AND w |- p /\ q&lt;br /&gt;andE (v |- p /\ q) =&gt; v |- p&lt;br /&gt;andE` (v |- p /\ q) =&gt; v |- q&lt;br /&gt;orI (v |- p) q =&gt; p$ v |- p \/ q&lt;br /&gt;orI` (v |- p) q =&gt; q$ v |- q \/ p&lt;br /&gt;orE (v |- r) (w |- r`) (y |- p /\ q) | r == r` &amp;&amp; p IN v &amp;&amp; q IN w =&gt; (v WITHOUT p) AND (w WITHOUT q) AND y |- r&lt;br /&gt;//notI (v |- p) =&gt; v |- ~ (~ p)&lt;br /&gt;contra (v |- p) (w |- ~p`) | p == p` =&gt; v AND w |- B&lt;br /&gt;contra (v |- p) (w |- p` --&gt; B) | p == p` =&gt; v AND w |- B&lt;br /&gt;/* --------- NONCONSTRUCTIVE PART --------------- */&lt;br /&gt;absurd (v |- B) p | ~p IN v =&gt; p$ v WITHOUT ~p |- p&lt;br /&gt;botE (v |- B) p =&gt; p$ v |- p&lt;br /&gt;midE p =&gt; p$ EMPTY |- p \/ ~p&lt;br /&gt;&lt;br /&gt;:: Deduced&lt;br /&gt; = (|-) infix 1 (Set Prop) Prop&lt;br /&gt;&lt;br /&gt;/* -------------------------------------------- END OF TCB ------------------------------------- */&lt;br /&gt;&lt;br /&gt;:: Prop&lt;br /&gt; = (====) infix 4 Term Term | (&lt;) infix 4 Term Term | (&gt;) infix 4 Term Term&lt;br /&gt; | (=&lt;) infix 4 Term Term | (&gt;=) infix 4 Term Term | (--&gt;) infix 5 Prop Prop&lt;br /&gt;    | (&lt;--) infix 5 Prop Prop | (&lt;-&gt;) infix 5 Prop Prop | (\/) infixr 6 Prop Prop&lt;br /&gt;    | (/\) infixr 6 Prop Prop | ~ Prop | A [String] Prop | E [String] Prop&lt;br /&gt;    | B /* bottom */ | T /* truth */ | PV String&lt;br /&gt;&lt;br /&gt;derive gEq Prop ; instance == Prop where (==) a b = gEq{|*|} a b&lt;br /&gt;&lt;br /&gt;:: Term&lt;br /&gt; = I Int | F Real | S String | C String | TV String | (+) infixl 6 Term Term&lt;br /&gt; | (-) infixl 6 Term Term | (*) infixl 7 Term Term | (/) infixl 7 Term Term&lt;br /&gt; | (%) infixl 9 Term Term | (++) infixr 5 Term Term | (^) infixr 8 Term Term&lt;br /&gt;&lt;br /&gt;derive gEq Term ; instance == Term where (==) a b = gEq{|*|} a b&lt;br /&gt;&lt;br /&gt;:: Set a :== [a]&lt;br /&gt;&lt;br /&gt;EMPTY = []&lt;br /&gt;(WITH) infixl 3 :: [Prop] Prop -&gt; [Prop]&lt;br /&gt;(WITH) w p = [p:w WITHOUT p]&lt;br /&gt;(WITHOUT) infixl 3 :: [Prop] Prop -&gt; [Prop]&lt;br /&gt;(WITHOUT) [w:ws] p | w == p = ws ; = [w:ws WITHOUT p]&lt;br /&gt;(WITHOUT) [] _ = []&lt;br /&gt;(AND) infixl 2 :: [Prop] [Prop] -&gt; [Prop]&lt;br /&gt;(AND) w [v:vs] = (w WITH v) AND vs // remove pars?&lt;br /&gt;(AND) w [] = w&lt;br /&gt;(IN) infix 9 :: Prop [Prop] -&gt; Bool&lt;br /&gt;(IN) p [w:ws] | w == p = True ; = p IN ws&lt;br /&gt;(IN) _ [] = False&lt;br /&gt;&lt;br /&gt;($) infixr 0 :: Prop a -&gt; a&lt;br /&gt;($) p r | valid p = r ; = abort "SYNTAX"&lt;br /&gt;valid a = True&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-2973729469278993387?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/2973729469278993387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=2973729469278993387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2973729469278993387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2973729469278993387'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2009/07/tiny-proof-assistant-in-clean-without.html' title='Tiny proof assistant in Clean without Curry-Howard Isomorphism'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-8886980665564226689</id><published>2009-07-09T01:47:00.000-07:00</published><updated>2009-07-09T01:50:29.609-07:00</updated><title type='text'>Tiny proof assistant in Clean using Curry-Howard Isomorphism</title><content type='html'>&lt;pre&gt;&lt;br /&gt;module CHI&lt;br /&gt;&lt;br /&gt;Start = notE3 (|- (((P --&gt; Bot) --&gt; Bot) --&gt; Bot)) (Wff P)  //notI2 (|- P) (Wff P)&lt;br /&gt;where&lt;br /&gt; notE3 n3 wff_p = impI (hlp1 n3) wff_p&lt;br /&gt; where&lt;br /&gt;  hlp1 n3 p = nd_contra (notI2 p wff_p) n3&lt;br /&gt;&lt;br /&gt; notI2 p wff_p = impI (hlp p) (nd_not wff_p)&lt;br /&gt; where&lt;br /&gt;  hlp p pb = impE pb p&lt;br /&gt;&lt;br /&gt; nd_contra p pb = contra p (nd_not_def` pb)&lt;br /&gt; nd_not wff_p = wff_imp wff_p wff_bot&lt;br /&gt;&lt;br /&gt;/* ======================== TCB ========================== */&lt;br /&gt;&lt;br /&gt;/* must be hidden in separate module */&lt;br /&gt;&lt;br /&gt;/* ------- SYNTAX --------- */&lt;br /&gt;&lt;br /&gt;wff_a :: Wff CstA ; wff_a = Wff A ; wff_b :: Wff CstB ; wff_b = Wff B ; wff_p :: Wff CstP ; wff_p = Wff P&lt;br /&gt;wff_c :: Wff CstC ; wff_c = Wff C ; wff_d :: Wff CstD ; wff_d = Wff D ; wff_q :: Wff CstQ ; wff_q = Wff Q&lt;br /&gt;&lt;br /&gt;wff_bot :: Wff Bot&lt;br /&gt;wff_bot = Wff Bot&lt;br /&gt;&lt;br /&gt;wff_true :: Wff TRUE&lt;br /&gt;wff_true = Wff TRUE&lt;br /&gt;&lt;br /&gt;wff_not :: (Wff p) -&gt; Wff (Not p)&lt;br /&gt;wff_not (Wff p) =&gt; Wff (~ p)&lt;br /&gt;&lt;br /&gt;wff_and :: (Wff p) (Wff q) -&gt; Wff (And p q)&lt;br /&gt;wff_and (Wff p) (Wff q) =&gt; Wff (p /\ q)&lt;br /&gt;&lt;br /&gt;wff_or :: (Wff p) (Wff q) -&gt; Wff (Or p q)&lt;br /&gt;wff_or (Wff p) (Wff q) =&gt; Wff (p \/ q)&lt;br /&gt;&lt;br /&gt;wff_imp :: (Wff p) (Wff q) -&gt; Wff (Imp p q)&lt;br /&gt;wff_imp (Wff p) (Wff q) =&gt; Wff (p --&gt; q)&lt;br /&gt;&lt;br /&gt;/* ----------- CONSTRUCTIVE ---------- */&lt;br /&gt;&lt;br /&gt;impI :: ((Deduced p) -&gt; Deduced q) (Wff p) -&gt; Deduced (Imp p q)&lt;br /&gt;impI f (Wff p) =&gt; case f (|- p) of |- q -&gt; |- (p --&gt; q)&lt;br /&gt;&lt;br /&gt;impE :: (Deduced (Imp p q)) (Deduced p) -&gt; Deduced q&lt;br /&gt;impE (|- (p --&gt; q)) (|- p`) =&gt; |- q&lt;br /&gt;&lt;br /&gt;andI :: (Deduced p) (Deduced q) -&gt; Deduced (And p q)&lt;br /&gt;andI (|- p) (|- q) =&gt; |- (p /\ q)&lt;br /&gt;&lt;br /&gt;andE :: (Deduced (And p q)) -&gt; Deduced p&lt;br /&gt;andE (|- (p /\ q)) =&gt; |- p&lt;br /&gt;&lt;br /&gt;andE` :: (Deduced (And p q)) -&gt; Deduced q&lt;br /&gt;andE` (|- (p /\ q)) =&gt; |- q&lt;br /&gt;&lt;br /&gt;orI :: (Deduced p) (Wff q) -&gt; Deduced (Or p q)&lt;br /&gt;orI (|- p) (Wff q) =&gt; |- (p \/ q)&lt;br /&gt;&lt;br /&gt;orI` :: (Deduced p) (Wff q) -&gt; Deduced (Or p q)&lt;br /&gt;orI` (|- p) (Wff q) =&gt; |- (p \/ q)&lt;br /&gt;&lt;br /&gt;contra :: (Deduced p) (Deduced (Not p)) -&gt; Deduced Bot&lt;br /&gt;contra (|- p) (|- (~ q)) =&gt; |- Bot&lt;br /&gt;&lt;br /&gt;mp p q = impE p q&lt;br /&gt;nd_not_def (|- (~ p) ) = |- (p --&gt; Bot)&lt;br /&gt;nd_not_def` (|- (p --&gt; Bot)) = |- (~ p)&lt;br /&gt;&lt;br /&gt;/* ----------- NONCONSTRUCTIVE (move to separate module) --------- */&lt;br /&gt;&lt;br /&gt;absurd :: ((Deduced (Not p)) -&gt; Deduced Bot) (Wff p) -&gt; Deduced p&lt;br /&gt;absurd _ (Wff p) =&gt; |- p&lt;br /&gt;&lt;br /&gt;bottom_complete :: (Deduced Bot) (Wff p) -&gt; Deduced p&lt;br /&gt;bottom_complete (|- Bot) (Wff p) =&gt; |- p&lt;br /&gt;&lt;br /&gt;tertium :: (Wff p) -&gt; Deduced (Or p (Not p))&lt;br /&gt;tertium (Wff p) =&gt; |- (p \/ ~ p)&lt;br /&gt;&lt;br /&gt;:: Deduced p = |- p /* *MUST* be abstract type! */&lt;br /&gt;&lt;br /&gt;:: Wff a = Wff a /* *MUST* be abstract type! */&lt;br /&gt;&lt;br /&gt;/* ======================== END OF TCB ========================== */&lt;br /&gt;&lt;br /&gt;:: CstA = A ; :: CstB = B ; :: CstC = C ; :: CstD = D ; :: CstE = E ; :: CstP = P ; :: CstQ = Q&lt;br /&gt;:: Not a = ~ a&lt;br /&gt;:: Imp a b = (--&gt;) infix 5 a b&lt;br /&gt;:: And a b = (/\) infixr 6 a b&lt;br /&gt;:: Or a b = (\/) infixr 6 a b&lt;br /&gt;:: Bot = Bot&lt;br /&gt;:: TRUE = TRUE&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-8886980665564226689?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/8886980665564226689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=8886980665564226689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8886980665564226689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8886980665564226689'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2009/07/tiny-proof-assistant-in-clean-using.html' title='Tiny proof assistant in Clean using Curry-Howard Isomorphism'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-4538478971998385036</id><published>2009-03-03T01:50:00.000-08:00</published><updated>2009-03-03T01:53:46.190-08:00</updated><title type='text'>Read Only True Graph Builder In Functional Language</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;:: ROGraph a = ROGraph a [ROGraph a]&lt;br /&gt;:: RODGraph a = RODGraph a [RODGraph a] [RODGraph a]&lt;br /&gt;&lt;br /&gt;buildROGraph :: (a b (c,[b])) -&gt; Map b (ROGraph c) | Lookup MapOnList b &amp; UpdateDefault MapOnList b &amp; Pairs a&lt;br /&gt;buildROGraph m = buildGraph m \ id val fws bws = ROGraph val fws&lt;br /&gt;buildRODGraph m = buildGraph m \ id val fws bws = RODGraph val fws bws&lt;br /&gt;&lt;br /&gt;buildGraph rawGraph constructor = futureIndex&lt;br /&gt;where&lt;br /&gt; raw = pairs rawGraph&lt;br /&gt; forwards = buildFastMap $ flip map raw \ (id,(a,fws)) = (id,fws)&lt;br /&gt; backwards = buildBackwards forwards&lt;br /&gt; futureIndex = buildFastMap $ flip map raw \ (id,(a,fws)) = (id,build id a fws)&lt;br /&gt; fromFuture ids = map (fromJustXXX o lookup futureIndex) ids&lt;br /&gt; build nodeId contents forwards&lt;br /&gt;  # backwards = case lookup backwards nodeId of Just x -&gt; x ; _ -&gt; []&lt;br /&gt;  = constructor nodeId contents (fromFuture forwards) (fromFuture backwards)&lt;br /&gt;&lt;br /&gt;buildBackwards :: (a b [c]) -&gt; a c [b] | Empty (a c [b]) &amp; Pairs a &amp; UpdateDefault a c&lt;br /&gt;buildBackwards graph = seqMap processNode (pairs graph) empty&lt;br /&gt;where&lt;br /&gt; processNode (id,forwards) = seqMapLFA forwards \ fr m = snd $ updateDefault fr (cons id) [] m&lt;br /&gt;&lt;br /&gt;testGraph :: Map Int (Int,[Int])&lt;br /&gt;testGraph = fromPairs [ @1 [2,3,4], @2 [4,1], @3 [1,2], @4 [3,4] ]&lt;br /&gt;where&lt;br /&gt; @ a b = (a,(a,b))&lt;br /&gt;&lt;br /&gt;Start = printRODGraph $ fromJust $ lookup (buildRODGraph testGraph) 1&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-4538478971998385036?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/4538478971998385036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=4538478971998385036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/4538478971998385036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/4538478971998385036'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2009/03/read-only-true-graph-builder-in.html' title='Read Only True Graph Builder In Functional Language'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-8643670657574330297</id><published>2009-01-17T17:55:00.000-08:00</published><updated>2009-01-17T17:58:26.828-08:00</updated><title type='text'>Adding Pluggable Search Strategies to Your Favourite Functional Programming Language</title><content type='html'>&lt;pre&gt;&lt;br /&gt;search3 :: !Bool !(u:a -&gt; .(v:([u:a] -&gt; w:[.b]) -&gt; x:[.b])) u:a -&gt; y:[.b], [v &lt;= u,x v &lt;= w,x v &lt;= y]&lt;br /&gt;search3 kind explorer root&lt;br /&gt; | kind = do_all_depth [root] []&lt;br /&gt; = do_all_breadth [root] []&lt;br /&gt;where&lt;br /&gt; do_all_depth [] t = t&lt;br /&gt; do_all_depth [v:vs] t = explorer v \ vs` = do_all_depth vs` (do_all_depth vs t)&lt;br /&gt;    &lt;br /&gt; do_all_breadth [] t = t&lt;br /&gt; do_all_breadth [v:vs] t = explorer v \ vs` = do_all_breadth vs (do_all_breadth vs` t)&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-8643670657574330297?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/8643670657574330297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=8643670657574330297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8643670657574330297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/8643670657574330297'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2009/01/adding-pluggable-search-strategies-to.html' title='Adding Pluggable Search Strategies to Your Favourite Functional Programming Language'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-532986978519778493</id><published>2009-01-15T19:55:00.000-08:00</published><updated>2009-01-15T19:56:33.992-08:00</updated><title type='text'>Purely Functional Queue with Constant Operation Times (Credits to Okasaki)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;:: Queue a = Queue !Int !.[a] !Int !.[.[a]] /* enqLen enqList deqLen deqList */&lt;br /&gt;&lt;br /&gt;adjust :: !u:(Queue .a) -&gt; v:(Queue .a), [u &lt;= v]&lt;br /&gt;adjust q=:(Queue enqLen enqList deqLen deqList)&lt;br /&gt; | enqLen &gt; 3 &amp;&amp; enqLen &gt;= deqLen = Queue 0 [] (enqLen + deqLen) (deqList ++ [reverse enqList])&lt;br /&gt; | otherwise = q&lt;br /&gt;&lt;br /&gt;enq :: .a !u:(Queue .a) -&gt; v:(Queue .a), [u &lt;= v]&lt;br /&gt;enq a (Queue enqLen enqList deqLen deqList)&lt;br /&gt; = adjust (Queue (enqLen + 1) [a:enqList] deqLen deqList)&lt;br /&gt;&lt;br /&gt;deq :: !u:(Queue .a) -&gt; (.a, !v:(Queue .a)), [u &lt;= v]&lt;br /&gt;&lt;br /&gt;deq (Queue enqLen enqList deqLen [[]:deqList])&lt;br /&gt; = deq (Queue enqLen enqList deqLen deqList)&lt;br /&gt;&lt;br /&gt;deq (Queue enqLen enqList deqLen [[a:as]:deqList])&lt;br /&gt; = (a, adjust (Queue enqLen enqList (deqLen - 1) [as:deqList]))&lt;br /&gt;&lt;br /&gt;deq (Queue enqLen enqList 0 deqList)&lt;br /&gt; = deq (Queue 0 [] enqLen [reverse enqList])&lt;br /&gt;&lt;br /&gt;newq :: .(Queue .a)&lt;br /&gt;newq = Queue 0 [] 0 []&lt;br /&gt;&lt;br /&gt;emptyq :: !.(Queue .a) -&gt; .Bool&lt;br /&gt;emptyq (Queue 0 _ 0 _) = True&lt;br /&gt;emptyq _ = False&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-532986978519778493?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/532986978519778493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=532986978519778493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/532986978519778493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/532986978519778493'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2009/01/purely-functional-queue-with-constant.html' title='Purely Functional Queue with Constant Operation Times (Credits to Okasaki)'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-2643682747792784277</id><published>2008-11-11T00:30:00.000-08:00</published><updated>2011-03-08T08:05:24.103-08:00</updated><title type='text'>Introductory Course In Math: No Background Needed</title><content type='html'>1. Notion of representation&lt;br /&gt;2. Notion of encoding&lt;br /&gt;3. Requirements to glyphs: equality, recognisability, one might always realise where one ends and another begins&lt;br /&gt;4. Deductive apparatus, mathematical theories&lt;br /&gt;5. Interpretations of mathematical theories, constants&lt;br /&gt;6. Variables, historic excursion into prop calc, difference between variables and constants; quantors; variable substitution and its pitfalls&lt;br /&gt;7. What is Existence&lt;br /&gt;8. What is Truth&lt;br /&gt;9. Art of proof&lt;br /&gt;10. Soundness, completeness, consistency&lt;br /&gt;11. Proof theory&lt;br /&gt;12. Model theory&lt;br /&gt;&lt;br /&gt;(12 lessons, first two or three are short and may be conducted together)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-2643682747792784277?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/2643682747792784277/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=2643682747792784277' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2643682747792784277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2643682747792784277'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/11/introductory-course-to-applied-math-no.html' title='Introductory Course In Math: No Background Needed'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-7287113193622707784</id><published>2008-09-25T07:48:00.000-07:00</published><updated>2008-09-25T07:50:56.758-07:00</updated><title type='text'>Monadic Arithmetics</title><content type='html'>&lt;pre&gt;/* Stop &gt;&gt;= \a -&gt; &gt;&gt;= \b insane! */&lt;br /&gt;&lt;br /&gt;instance + (m a) | + a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (+) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a + b&lt;br /&gt;&lt;br /&gt;instance - (m a) | - a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (-) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a - b&lt;br /&gt;&lt;br /&gt;instance * (m a) | * a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (*) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a * b&lt;br /&gt;&lt;br /&gt;instance / (m a) | / a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (/) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a / b&lt;br /&gt;&lt;br /&gt;instance mod (m a) | mod a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (mod) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a mod b&lt;br /&gt;&lt;br /&gt;instance rem (m a) | rem a &amp; Monad m&lt;br /&gt;where&lt;br /&gt; (rem) ma mb = ma &gt;&gt;= \a -&gt; mb &gt;&gt;= \b -&gt; return $! a rem b&lt;br /&gt;&lt;br /&gt;/* http://hpaste.org/10673 */&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-7287113193622707784?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/7287113193622707784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=7287113193622707784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/7287113193622707784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/7287113193622707784'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/09/monadic-arithmetics.html' title='Monadic Arithmetics'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-2880827253179125429</id><published>2008-09-14T04:15:00.000-07:00</published><updated>2008-09-14T04:19:14.102-07:00</updated><title type='text'>Heterogeneous lists for poor Concurrent Clean programmer</title><content type='html'>&lt;pre&gt;module sh /* search hlist */&lt;br /&gt;&lt;br /&gt;import Same, FuncPipe, UnitType, UndefValue, Float, ErrorValue, Char, Logical, String&lt;br /&gt;import Map, FPToolbox&lt;br /&gt;&lt;br /&gt;Start = test2&lt;br /&gt;&lt;br /&gt;//////////////////////////////&lt;br /&gt;&lt;br /&gt;:: O = O&lt;br /&gt;:: I a = I a&lt;br /&gt;&lt;br /&gt;pos0 = O&lt;br /&gt;add1 a = I a&lt;br /&gt;add2 a = I (I a)&lt;br /&gt;add3 a = I (I (I a))&lt;br /&gt;pos1 = add1 pos0&lt;br /&gt;pos2 = add2 pos0&lt;br /&gt;pos3 = add3 pos0&lt;br /&gt;pos4 = add1 pos3&lt;br /&gt;pos5 = add2 pos4&lt;br /&gt;pos6 = add3 pos3&lt;br /&gt;pos7 = add3 pos4&lt;br /&gt;pos8 = add3 pos5&lt;br /&gt;&lt;br /&gt;///////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;test2 :: String&lt;br /&gt;test2 = selectHList pos0 ("hello",(-15.84,(100,(True,&lt;&gt;))))&lt;br /&gt;&lt;br /&gt;class SelectHList i a t&lt;br /&gt;where&lt;br /&gt; selectHList :: i a -&gt; t&lt;br /&gt;&lt;br /&gt;instance SelectHList (I i) (a,b) t | SelectHList i b t&lt;br /&gt;where&lt;br /&gt; selectHList (I i) (a,b) = selectHList i b&lt;br /&gt;&lt;br /&gt;instance SelectHList O (a,b) a` | Same a a`&lt;br /&gt;where&lt;br /&gt; selectHList O (a,b) = same a&lt;br /&gt;&lt;br /&gt;////////////////////////////////////////////////////&lt;br /&gt;&lt;br /&gt;test :: String&lt;br /&gt;test = searchHList ("hello",(-15.84,(100,(True,&lt;&gt;))))&lt;br /&gt;&lt;br /&gt;class SearchHList t a&lt;br /&gt;where&lt;br /&gt; searchHList :: !a -&gt; t&lt;br /&gt;&lt;br /&gt;instance SearchHList t &lt;&gt;&lt;br /&gt;where&lt;br /&gt; searchHList &lt;&gt; = error "SearchHList: type not found!"&lt;br /&gt;&lt;br /&gt;instance SearchHList t (a,b) | IfTypeEqual t a &amp; SearchHList t b // allways inline this instance&lt;br /&gt;where&lt;br /&gt; searchHList (a,b) = ifTypeEqual a $ searchHList b&lt;br /&gt;&lt;br /&gt;class IfTypeEqual t a&lt;br /&gt;where&lt;br /&gt; ifTypeEqual :: a t -&gt; t&lt;br /&gt;&lt;br /&gt;instance IfTypeEqual Int Int  where ifTypeEqual a b = a&lt;br /&gt;instance IfTypeEqual Bool Bool  where ifTypeEqual a b = a&lt;br /&gt;instance IfTypeEqual Float Float where ifTypeEqual a b = a&lt;br /&gt;instance IfTypeEqual Char Char  where ifTypeEqual a b = a&lt;br /&gt;instance IfTypeEqual String String where ifTypeEqual a b = a&lt;br /&gt;instance IfTypeEqual [t] [a] | IfTypeEqual t a&lt;br /&gt;where&lt;br /&gt; ifTypeEqual a b = map (\(ae,be) -&gt; ifTypeEqual ae be) $ zip2 a b&lt;br /&gt;&lt;br /&gt;instance IfTypeEqual t a where ifTypeEqual a f = f&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-2880827253179125429?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/2880827253179125429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=2880827253179125429' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2880827253179125429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/2880827253179125429'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/09/heterogeneous-lists-for-poor-concurrent.html' title='Heterogeneous lists for poor Concurrent Clean programmer'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-5782357337600621213</id><published>2008-07-24T10:04:00.000-07:00</published><updated>2008-07-24T10:06:29.533-07:00</updated><title type='text'>My Desktop 2008</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_39JG1fdgIQU/SIi2gUztKVI/AAAAAAAAABA/PkRZCAts-Js/s1600-h/MyDesktop.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_39JG1fdgIQU/SIi2gUztKVI/AAAAAAAAABA/PkRZCAts-Js/s320/MyDesktop.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5226628034021108050" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-5782357337600621213?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/5782357337600621213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=5782357337600621213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/5782357337600621213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/5782357337600621213'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/07/my-desktop-2008.html' title='My Desktop 2008'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_39JG1fdgIQU/SIi2gUztKVI/AAAAAAAAABA/PkRZCAts-Js/s72-c/MyDesktop.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-4466022432721190020</id><published>2008-06-06T10:43:00.001-07:00</published><updated>2008-06-06T10:51:16.500-07:00</updated><title type='text'>Laziness without laziness</title><content type='html'>&lt;pre&gt;&lt;br /&gt;foldM_ f xs = fold (\a e -&gt; a &gt;&gt; f e) (return ()) xs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Instead of making chain of dynamically created functions from data list it is better to create a function that makes next function in chain&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;foldM_ f l = foldLoop l&lt;br /&gt;where&lt;br /&gt;        foldLoop []     = return ()&lt;br /&gt; foldLoop [x:xs] = f x &gt;&gt; foldLoop xs&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Notice that this fragment does not use any language laziness.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-4466022432721190020?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/4466022432721190020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=4466022432721190020' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/4466022432721190020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/4466022432721190020'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/06/laziness-without-laziness.html' title='Laziness without laziness'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-6046761261401417259</id><published>2008-06-03T07:30:00.000-07:00</published><updated>2008-06-05T15:46:33.663-07:00</updated><title type='text'>2*n+h n Solution for Breadth-First Numbering (Okasaki paper)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;data Tree a = Tree a (Tree a) (Tree a) | Leaf a | EmptyLeaf&lt;br /&gt; deriving (Show,Eq)&lt;br /&gt;&lt;br /&gt;renameTreeNodes :: (Tree a) -&gt; [Int] -&gt; (Tree Int)&lt;br /&gt;renameTreeNodes tree counts     = fst $ renameLoop tree counts&lt;br /&gt; where&lt;br /&gt; renameLoop EmptyLeaf   cs    = (EmptyLeaf, cs)&lt;br /&gt; renameLoop (Leaf _)   (c:cs)   = (Leaf c, (c+1):cs)&lt;br /&gt; renameLoop (Tree _ lb rb) (c:cs)   = (Tree c lb' rb', (c+1):csLR)&lt;br /&gt;  where&lt;br /&gt;  (lb',csL) = renameLoop lb cs&lt;br /&gt;  (rb',csLR) = renameLoop rb csL&lt;br /&gt;&lt;br /&gt;countsToBases :: [Int] -&gt; [Int]&lt;br /&gt;countsToBases cs = ctbLoop cs 1&lt;br /&gt; where&lt;br /&gt; ctbLoop [c] b  = [b]&lt;br /&gt; ctbLoop (c:cs) b = b:ctbLoop cs (b + c)&lt;br /&gt;&lt;br /&gt;countOnEachLevel :: (Tree a) -&gt; [Int]&lt;br /&gt;countOnEachLevel tree = countLoop tree []&lt;br /&gt; where&lt;br /&gt; countLoop EmptyLeaf counts = counts&lt;br /&gt; countLoop (Leaf _) (c:cs) = (c+1):cs&lt;br /&gt; countLoop tree []  = countLoop tree [0]&lt;br /&gt; countLoop (Tree _ leftBranch rightBranch) (c:cs) = (c+1):csLR&lt;br /&gt;  where&lt;br /&gt;  csL = countLoop leftBranch cs&lt;br /&gt;  csLR = countLoop rightBranch csL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;Amazingly improved by &lt;a href="http://www.blogger.com/profile/02745499320156194052"&gt;BlackMeph&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;main = print . renameTreeNodes $ testTree&lt;br /&gt;&lt;br /&gt;renameTreeNodes :: Tree a -&gt; Tree Int&lt;br /&gt;renameTreeNodes tree = t' where&lt;br /&gt;    (t',ks) = renameLoop tree (1:ks)&lt;br /&gt;    renameLoop EmptyLeaf cs = (EmptyLeaf,cs)&lt;br /&gt;    renameLoop (Leaf _) (c:cs) = (Leaf c,(c+1):cs)&lt;br /&gt;    renameLoop (Tree _ lb rb) (c:cs) = (Tree c lb' rb',(c+1):csLR) where&lt;br /&gt;       (lb',csL)  = renameLoop lb cs&lt;br /&gt;       (rb',csLR) = renameLoop rb csL&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://hpaste.org/8069"&gt;Source at HPASTE&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_39JG1fdgIQU/SEhspLR7FXI/AAAAAAAAAAY/1KyJe21C3Kk/s1600-h/a.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_39JG1fdgIQU/SEhspLR7FXI/AAAAAAAAAAY/1KyJe21C3Kk/s320/a.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5208532423712380274" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-6046761261401417259?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/6046761261401417259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=6046761261401417259' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/6046761261401417259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/6046761261401417259'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/06/solution-for-breadth-first-numbering.html' title='&lt;strike&gt;2*n+h&lt;/strike&gt; n Solution for Breadth-First Numbering (Okasaki paper)'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_39JG1fdgIQU/SEhspLR7FXI/AAAAAAAAAAY/1KyJe21C3Kk/s72-c/a.gif' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2405446824614547939.post-5418288381801642131</id><published>2008-05-27T04:21:00.000-07:00</published><updated>2008-05-27T04:23:34.853-07:00</updated><title type='text'>Fascinating excursion in monads history</title><content type='html'>The notion of monad comes from category theory. It first arose in the area of homological algebra, but later was recognised (due to the work of Kleisli and of Eilenberg and Moore) to have much wider applications.&lt;br /&gt;&lt;br /&gt;Its importance emerged slowly: in early days, it was not even given a proper name, but called simply a "standard construction" or a "triple". The formulation used here is due to Kleisli.&lt;br /&gt;&lt;br /&gt;Eugenio Moggi proposed that monads provide a useful structuring tool for denotational semantics. He showed how lambda calculus could be given call-by-value and call-by-name semantics in an arbitrary monad, and how monads could encapsulate&lt;br /&gt;a wide variety of programming language features such as state, exception handling, and continuations.&lt;br /&gt;&lt;br /&gt;Independent of Moggi, but at about the same time, Michael Spivey proposed that monads provide a useful structuring tool for exception handling in pure functional languages, and demonstrated this thesis with an elegant program for term rewriting. He showed how monads could treat exceptions and non-deterministic choice in a common framework, thus capturing precisely a notion that I had groped towards years earlier.&lt;br /&gt;&lt;br /&gt;Inspired byMoggi and Spivey, I proposed monads as a general technique for structuring functional programs. My early proposals were based on a special syntax for monads, that generalised list comprehensions. This was unfortunate, in that it led many to think a special syntax was needed.&lt;br /&gt;&lt;br /&gt;This new presentation is designed to convey that monads can be profitably applied to structure programs today with existing languages.&lt;br /&gt;&lt;br /&gt;A key observation of Moggi's was that values and computations should be assigned different types: the value type a is distinct from the computation type M a. In a call-by-value language, functions take values into computations (as in a -&gt; M b); in a call-by-name language, functions take computations into computations (as in M a -&gt; M b).&lt;br /&gt;&lt;br /&gt;John Reynolds made exactly the same point a decade ago. The essence of Algol, according to Reynolds, is a programming language that distinguishes data types from phrase types. In his work data types (such as int) play the roles of values, and phrase types (such as int exp) play the role of computations, and the same distinction between call-by-value and call-by-name appears. These ideas form the basis for the design of Forsythe. But the vital unitM and bindM operations do not appear in Reynolds' work.&lt;br /&gt;&lt;br /&gt;This is not the only time that John Reynolds has been a decade ahead of the rest of us. Among other things, he was an early promoter of continuation-passing style and the first to apply category theory to language design. One intriguing aspect of his recent work is the use of intersection types, so perhaps we should expect an upsurge of interest in that topic early in the next millenium.&lt;br /&gt;&lt;br /&gt;-- "The essence of functional programming", Philip Wadler, University of Glasgow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2405446824614547939-5418288381801642131?l=vagston.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://vagston.blogspot.com/feeds/5418288381801642131/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2405446824614547939&amp;postID=5418288381801642131' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/5418288381801642131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2405446824614547939/posts/default/5418288381801642131'/><link rel='alternate' type='text/html' href='http://vagston.blogspot.com/2008/05/fascinating-excursion-in-monads-history.html' title='Fascinating excursion in monads history'/><author><name>Vag</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://4.bp.blogspot.com/_39JG1fdgIQU/TD82RK6KuqI/AAAAAAAAADU/Ipzvs8ZdY2A/S220/avatar2.PNG'/></author><thr:total>0</thr:total></entry></feed>
