A Beginners Guide to Building a RAG App Using Open Source Milvus
ATS/LF for Coq users
1. ATS/LF for Coq usersATS/LF for Coq usersATS/LF for Coq usersATS/LF for Coq usersATS/LF for Coq users
Kiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu OkabeKiwamu Okabe
2. What is ATS?What is ATS?What is ATS?What is ATS?What is ATS?
☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/☆ http://www.ats-lang.org/
☆ DML-style dependent types☆ DML-style dependent types☆ DML-style dependent types☆ DML-style dependent types☆ DML-style dependent types
☆ Linear types☆ Linear types☆ Linear types☆ Linear types☆ Linear types
☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC☆ Optional GC
☆ Optional malloc/free☆ Optional malloc/free☆ Optional malloc/free☆ Optional malloc/free☆ Optional malloc/free
☆ Optional run-time☆ Optional run-time☆ Optional run-time☆ Optional run-time☆ Optional run-time
4. What is ATS/LF?What is ATS/LF?What is ATS/LF?What is ATS/LF?What is ATS/LF?
☆ "ATS logical framework"☆ "ATS logical framework"☆ "ATS logical framework"☆ "ATS logical framework"☆ "ATS logical framework"
☆ Subsystem for therorem-proving☆ Subsystem for therorem-proving☆ Subsystem for therorem-proving☆ Subsystem for therorem-proving☆ Subsystem for therorem-proving
☆ Construct proofs as total functions☆ Construct proofs as total functions☆ Construct proofs as total functions☆ Construct proofs as total functions☆ Construct proofs as total functions
☆ Without tactic☆ Without tactic☆ Without tactic☆ Without tactic☆ Without tactic
☆ Can mix proof with implementation☆ Can mix proof with implementation☆ Can mix proof with implementation☆ Can mix proof with implementation☆ Can mix proof with implementation
☆ Programming with Theorem-Proving
(PwTP)
☆ Programming with Theorem-Proving
(PwTP)
☆ Programming with Theorem-Proving
(PwTP)
☆ Programming with Theorem-Proving
(PwTP)
☆ Programming with Theorem-Proving
(PwTP)
5. Curry–Howard in ATSCurry–Howard in ATSCurry–Howard in ATSCurry–Howard in ATSCurry–Howard in ATS
☆ Type: Function signature introduced
by keyword "fun"
☆ Type: Function signature introduced
by keyword "fun"
☆ Type: Function signature introduced
by keyword "fun"
☆ Type: Function signature introduced
by keyword "fun"
☆ Type: Function signature introduced
by keyword "fun"
☆ Program: Function body introduced
by keyword "implement"
☆ Program: Function body introduced
by keyword "implement"
☆ Program: Function body introduced
by keyword "implement"
☆ Program: Function body introduced
by keyword "implement"
☆ Program: Function body introduced
by keyword "implement"
☆ Proposition: Proof function signature
introduced by keyword "prfun"
☆ Proposition: Proof function signature
introduced by keyword "prfun"
☆ Proposition: Proof function signature
introduced by keyword "prfun"
☆ Proposition: Proof function signature
introduced by keyword "prfun"
☆ Proposition: Proof function signature
introduced by keyword "prfun"
☆ Proof: Proof function body
introduced by keyword "primplement"
☆ Proof: Proof function body
introduced by keyword "primplement"
☆ Proof: Proof function body
introduced by keyword "primplement"
☆ Proof: Proof function body
introduced by keyword "primplement"
☆ Proof: Proof function body
introduced by keyword "primplement"
6. Style of functions on ATSStyle of functions on ATSStyle of functions on ATSStyle of functions on ATSStyle of functions on ATS
7. Grammar of function signatureGrammar of function signatureGrammar of function signatureGrammar of function signatureGrammar of function signature
8. Grammar of function bodyGrammar of function bodyGrammar of function bodyGrammar of function bodyGrammar of function body
10. Application after compilingApplication after compilingApplication after compilingApplication after compilingApplication after compiling
Proof is erased at compile time.Proof is erased at compile time.Proof is erased at compile time.Proof is erased at compile time.Proof is erased at compile time.
11. Pros of mixed functionPros of mixed functionPros of mixed functionPros of mixed functionPros of mixed function
You can write following application:You can write following application:You can write following application:You can write following application:You can write following application:
☆ Program without garbage collection☆ Program without garbage collection☆ Program without garbage collection☆ Program without garbage collection☆ Program without garbage collection
☆ Proof to prove the program☆ Proof to prove the program☆ Proof to prove the program☆ Proof to prove the program☆ Proof to prove the program
Good news for low-level programming!Good news for low-level programming!Good news for low-level programming!Good news for low-level programming!Good news for low-level programming!
12. Start at "Software Foundations"Start at "Software Foundations"Start at "Software Foundations"Start at "Software Foundations"Start at "Software Foundations"
http://www.cis.upenn.edu/~bcpierce/sf/current/
http://proofcafe.org/sf-beta/
Chapter "Prop: Propositions and Evidence"
http://www.cis.upenn.edu/~bcpierce/sf/current/
http://proofcafe.org/sf-beta/
Chapter "Prop: Propositions and Evidence"
http://www.cis.upenn.edu/~bcpierce/sf/current/
http://proofcafe.org/sf-beta/
Chapter "Prop: Propositions and Evidence"
http://www.cis.upenn.edu/~bcpierce/sf/current/
http://proofcafe.org/sf-beta/
Chapter "Prop: Propositions and Evidence"
http://www.cis.upenn.edu/~bcpierce/sf/current/
http://proofcafe.org/sf-beta/
Chapter "Prop: Propositions and Evidence"
13. Day of week on CoqDay of week on CoqDay of week on CoqDay of week on CoqDay of week on Coq
(* Coq *)
Inductive day : Type :=
| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
Inductive good_day : day -> Prop :=
| gd_sat : good_day saturday
| gd_sun : good_day sunday.
Theorem gds : good_day sunday.
Proof. apply gd_sun. Qed.
(* Coq *)
Inductive day : Type :=
| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
Inductive good_day : day -> Prop :=
| gd_sat : good_day saturday
| gd_sun : good_day sunday.
Theorem gds : good_day sunday.
Proof. apply gd_sun. Qed.
(* Coq *)
Inductive day : Type :=
| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
Inductive good_day : day -> Prop :=
| gd_sat : good_day saturday
| gd_sun : good_day sunday.
Theorem gds : good_day sunday.
Proof. apply gd_sun. Qed.
(* Coq *)
Inductive day : Type :=
| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
Inductive good_day : day -> Prop :=
| gd_sat : good_day saturday
| gd_sun : good_day sunday.
Theorem gds : good_day sunday.
Proof. apply gd_sun. Qed.
(* Coq *)
Inductive day : Type :=
| monday : day
| tuesday : day
| wednesday : day
| thursday : day
| friday : day
| saturday : day
| sunday : day.
Inductive good_day : day -> Prop :=
| gd_sat : good_day saturday
| gd_sun : good_day sunday.
Theorem gds : good_day sunday.
Proof. apply gd_sun. Qed.
14. Day of week on ATS/LFDay of week on ATS/LFDay of week on ATS/LFDay of week on ATS/LFDay of week on ATS/LF
(* ATS/LF *)
datasort Day =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
dataprop Good_Day (Day) =
| Gd_Sat (Saturday) of ()
| Gd_Sun (Sunday) of ()
extern prfun gds: Good_Day Sunday
primplement gds = Gd_Sun ()
(* ATS/LF *)
datasort Day =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
dataprop Good_Day (Day) =
| Gd_Sat (Saturday) of ()
| Gd_Sun (Sunday) of ()
extern prfun gds: Good_Day Sunday
primplement gds = Gd_Sun ()
(* ATS/LF *)
datasort Day =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
dataprop Good_Day (Day) =
| Gd_Sat (Saturday) of ()
| Gd_Sun (Sunday) of ()
extern prfun gds: Good_Day Sunday
primplement gds = Gd_Sun ()
(* ATS/LF *)
datasort Day =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
dataprop Good_Day (Day) =
| Gd_Sat (Saturday) of ()
| Gd_Sun (Sunday) of ()
extern prfun gds: Good_Day Sunday
primplement gds = Gd_Sun ()
(* ATS/LF *)
datasort Day =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
dataprop Good_Day (Day) =
| Gd_Sat (Saturday) of ()
| Gd_Sun (Sunday) of ()
extern prfun gds: Good_Day Sunday
primplement gds = Gd_Sun ()
Coq and ATS/LF have same structure.Coq and ATS/LF have same structure.Coq and ATS/LF have same structure.Coq and ATS/LF have same structure.Coq and ATS/LF have same structure.
15. Typecheck ATS/LF codeTypecheck ATS/LF codeTypecheck ATS/LF codeTypecheck ATS/LF codeTypecheck ATS/LF code
$ patsopt -tc -d main.dats$ patsopt -tc -d main.dats$ patsopt -tc -d main.dats$ patsopt -tc -d main.dats$ patsopt -tc -d main.dats
The command only does type check. It's
useful to check proof.
The command only does type check. It's
useful to check proof.
The command only does type check. It's
useful to check proof.
The command only does type check. It's
useful to check proof.
The command only does type check. It's
useful to check proof.
Also you can use flymake on Emacs.Also you can use flymake on Emacs.Also you can use flymake on Emacs.Also you can use flymake on Emacs.Also you can use flymake on Emacs.
https://github.com/githwxi/ATS-Postiats/blob/master/utils/emacs/
ats2-flymake.el
https://github.com/githwxi/ATS-Postiats/blob/master/utils/emacs/
ats2-flymake.el
https://github.com/githwxi/ATS-Postiats/blob/master/utils/emacs/
ats2-flymake.el
https://github.com/githwxi/ATS-Postiats/blob/master/utils/emacs/
ats2-flymake.el
https://github.com/githwxi/ATS-Postiats/blob/master/utils/emacs/
ats2-flymake.el
18. More proof on ATS/LFMore proof on ATS/LFMore proof on ATS/LFMore proof on ATS/LFMore proof on ATS/LF
(* ATS/LF *)
dataprop Day_Before (Day, Day) =
| DB_Tue (Tuesday, Monday) of ()
| DB_Wed (Wednesday, Tuesday) of ()
| DB_Thu (Thursday, Wednesday) of ()
| DB_Fri (Friday, Thursday) of ()
| DB_Sat (Saturday, Friday) of ()
| DB_Sun (Sunday, Saturday) of ()
| DB_Mon (Monday, Sunday) of ()
dataprop Ok_Day (Day) =
| {d:Day} Okd_Gd (d) of (Good_Day d)
| {d1,d2:Day} Okd_Before (d1) of (Ok_Day d2, Day_Before (d2, d1))
prfun okdw: Ok_Day Wednesday = let
prval okd_sat = Okd_Gd (Gd_Sat ())
prval okd_fri = Okd_Before (okd_sat, DB_Sat ())
prval okd_thu = Okd_Before (okd_fri, DB_Fri ())
prval okd_wed = Okd_Before (okd_thu, DB_Thu ())
in
okd_wed
end
(* ATS/LF *)
dataprop Day_Before (Day, Day) =
| DB_Tue (Tuesday, Monday) of ()
| DB_Wed (Wednesday, Tuesday) of ()
| DB_Thu (Thursday, Wednesday) of ()
| DB_Fri (Friday, Thursday) of ()
| DB_Sat (Saturday, Friday) of ()
| DB_Sun (Sunday, Saturday) of ()
| DB_Mon (Monday, Sunday) of ()
dataprop Ok_Day (Day) =
| {d:Day} Okd_Gd (d) of (Good_Day d)
| {d1,d2:Day} Okd_Before (d1) of (Ok_Day d2, Day_Before (d2, d1))
prfun okdw: Ok_Day Wednesday = let
prval okd_sat = Okd_Gd (Gd_Sat ())
prval okd_fri = Okd_Before (okd_sat, DB_Sat ())
prval okd_thu = Okd_Before (okd_fri, DB_Fri ())
prval okd_wed = Okd_Before (okd_thu, DB_Thu ())
in
okd_wed
end
(* ATS/LF *)
dataprop Day_Before (Day, Day) =
| DB_Tue (Tuesday, Monday) of ()
| DB_Wed (Wednesday, Tuesday) of ()
| DB_Thu (Thursday, Wednesday) of ()
| DB_Fri (Friday, Thursday) of ()
| DB_Sat (Saturday, Friday) of ()
| DB_Sun (Sunday, Saturday) of ()
| DB_Mon (Monday, Sunday) of ()
dataprop Ok_Day (Day) =
| {d:Day} Okd_Gd (d) of (Good_Day d)
| {d1,d2:Day} Okd_Before (d1) of (Ok_Day d2, Day_Before (d2, d1))
prfun okdw: Ok_Day Wednesday = let
prval okd_sat = Okd_Gd (Gd_Sat ())
prval okd_fri = Okd_Before (okd_sat, DB_Sat ())
prval okd_thu = Okd_Before (okd_fri, DB_Fri ())
prval okd_wed = Okd_Before (okd_thu, DB_Thu ())
in
okd_wed
end
(* ATS/LF *)
dataprop Day_Before (Day, Day) =
| DB_Tue (Tuesday, Monday) of ()
| DB_Wed (Wednesday, Tuesday) of ()
| DB_Thu (Thursday, Wednesday) of ()
| DB_Fri (Friday, Thursday) of ()
| DB_Sat (Saturday, Friday) of ()
| DB_Sun (Sunday, Saturday) of ()
| DB_Mon (Monday, Sunday) of ()
dataprop Ok_Day (Day) =
| {d:Day} Okd_Gd (d) of (Good_Day d)
| {d1,d2:Day} Okd_Before (d1) of (Ok_Day d2, Day_Before (d2, d1))
prfun okdw: Ok_Day Wednesday = let
prval okd_sat = Okd_Gd (Gd_Sat ())
prval okd_fri = Okd_Before (okd_sat, DB_Sat ())
prval okd_thu = Okd_Before (okd_fri, DB_Fri ())
prval okd_wed = Okd_Before (okd_thu, DB_Thu ())
in
okd_wed
end
(* ATS/LF *)
dataprop Day_Before (Day, Day) =
| DB_Tue (Tuesday, Monday) of ()
| DB_Wed (Wednesday, Tuesday) of ()
| DB_Thu (Thursday, Wednesday) of ()
| DB_Fri (Friday, Thursday) of ()
| DB_Sat (Saturday, Friday) of ()
| DB_Sun (Sunday, Saturday) of ()
| DB_Mon (Monday, Sunday) of ()
dataprop Ok_Day (Day) =
| {d:Day} Okd_Gd (d) of (Good_Day d)
| {d1,d2:Day} Okd_Before (d1) of (Ok_Day d2, Day_Before (d2, d1))
prfun okdw: Ok_Day Wednesday = let
prval okd_sat = Okd_Gd (Gd_Sat ())
prval okd_fri = Okd_Before (okd_sat, DB_Sat ())
prval okd_thu = Okd_Before (okd_fri, DB_Fri ())
prval okd_wed = Okd_Before (okd_thu, DB_Thu ())
in
okd_wed
end
19. Proof using recursionProof using recursionProof using recursionProof using recursionProof using recursion
(* Coq *)
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Theorem ev_ev_even : forall n m,
ev (n+m) -> ev n -> ev m.
Proof.
(* FILL IN HERE *) Admitted.
(* Coq *)
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Theorem ev_ev_even : forall n m,
ev (n+m) -> ev n -> ev m.
Proof.
(* FILL IN HERE *) Admitted.
(* Coq *)
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Theorem ev_ev_even : forall n m,
ev (n+m) -> ev n -> ev m.
Proof.
(* FILL IN HERE *) Admitted.
(* Coq *)
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Theorem ev_ev_even : forall n m,
ev (n+m) -> ev n -> ev m.
Proof.
(* FILL IN HERE *) Admitted.
(* Coq *)
Inductive ev : nat -> Prop :=
| ev_0 : ev O
| ev_SS : forall n:nat, ev n -> ev (S (S n)).
Theorem ev_ev_even : forall n m,
ev (n+m) -> ev n -> ev m.
Proof.
(* FILL IN HERE *) Admitted.
(* ATS/LF *)
dataprop Ev (int) =
| Ev_0 (0) of ()
| {n:nat} Ev_SS (n+2) of Ev n
prfun ev_ev_even {n,m:nat} .<n>. (enm: Ev (n+m), en: Ev n): Ev m =
case+ en of
| Ev_0 () => enm
| Ev_SS en' => let
prval Ev_SS enm' = enm
in
ev_ev_even (enm', en')
end
(* ATS/LF *)
dataprop Ev (int) =
| Ev_0 (0) of ()
| {n:nat} Ev_SS (n+2) of Ev n
prfun ev_ev_even {n,m:nat} .<n>. (enm: Ev (n+m), en: Ev n): Ev m =
case+ en of
| Ev_0 () => enm
| Ev_SS en' => let
prval Ev_SS enm' = enm
in
ev_ev_even (enm', en')
end
(* ATS/LF *)
dataprop Ev (int) =
| Ev_0 (0) of ()
| {n:nat} Ev_SS (n+2) of Ev n
prfun ev_ev_even {n,m:nat} .<n>. (enm: Ev (n+m), en: Ev n): Ev m =
case+ en of
| Ev_0 () => enm
| Ev_SS en' => let
prval Ev_SS enm' = enm
in
ev_ev_even (enm', en')
end
(* ATS/LF *)
dataprop Ev (int) =
| Ev_0 (0) of ()
| {n:nat} Ev_SS (n+2) of Ev n
prfun ev_ev_even {n,m:nat} .<n>. (enm: Ev (n+m), en: Ev n): Ev m =
case+ en of
| Ev_0 () => enm
| Ev_SS en' => let
prval Ev_SS enm' = enm
in
ev_ev_even (enm', en')
end
(* ATS/LF *)
dataprop Ev (int) =
| Ev_0 (0) of ()
| {n:nat} Ev_SS (n+2) of Ev n
prfun ev_ev_even {n,m:nat} .<n>. (enm: Ev (n+m), en: Ev n): Ev m =
case+ en of
| Ev_0 () => enm
| Ev_SS en' => let
prval Ev_SS enm' = enm
in
ev_ev_even (enm', en')
end
20. ATS has proved list libraryATS has proved list libraryATS has proved list libraryATS has proved list libraryATS has proved list library
21. Abstract listAbstract listAbstract listAbstract listAbstract list
Defined at libats/SATS/ilist_prf.sats.Defined at libats/SATS/ilist_prf.sats.Defined at libats/SATS/ilist_prf.sats.Defined at libats/SATS/ilist_prf.sats.Defined at libats/SATS/ilist_prf.sats.
datasort ilist =
| ilist_nil of ()
| ilist_cons of (int, ilist)
datasort ilist =
| ilist_nil of ()
| ilist_cons of (int, ilist)
datasort ilist =
| ilist_nil of ()
| ilist_cons of (int, ilist)
datasort ilist =
| ilist_nil of ()
| ilist_cons of (int, ilist)
datasort ilist =
| ilist_nil of ()
| ilist_cons of (int, ilist)
23. Proposition with proofProposition with proofProposition with proofProposition with proofProposition with proof
prfun lemma_snoc_length
{xs:ilist}{x:int}{xsx:ilist}{n:int}
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)): LENGTH (xsx, n+1)
primplmnt lemma_snoc_length (pf1, pf2) = let
prfun lemma
{xs:ilist}{x:int}{xsx:ilist}{n:int} .<xs>.
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)):
LENGTH (xsx, n+1) = let
in
case+ pf1 of
| SNOCnil () => let
prval LENGTHnil () = pf2 in LENGTHcons (LENGTHnil ())
end
| SNOCcons (pf1) => let
prval LENGTHcons (pf2) = pf2
in LENGTHcons (lemma (pf1, pf2))
end
end
in
lemma (pf1, pf2)
end
prfun lemma_snoc_length
{xs:ilist}{x:int}{xsx:ilist}{n:int}
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)): LENGTH (xsx, n+1)
primplmnt lemma_snoc_length (pf1, pf2) = let
prfun lemma
{xs:ilist}{x:int}{xsx:ilist}{n:int} .<xs>.
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)):
LENGTH (xsx, n+1) = let
in
case+ pf1 of
| SNOCnil () => let
prval LENGTHnil () = pf2 in LENGTHcons (LENGTHnil ())
end
| SNOCcons (pf1) => let
prval LENGTHcons (pf2) = pf2
in LENGTHcons (lemma (pf1, pf2))
end
end
in
lemma (pf1, pf2)
end
prfun lemma_snoc_length
{xs:ilist}{x:int}{xsx:ilist}{n:int}
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)): LENGTH (xsx, n+1)
primplmnt lemma_snoc_length (pf1, pf2) = let
prfun lemma
{xs:ilist}{x:int}{xsx:ilist}{n:int} .<xs>.
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)):
LENGTH (xsx, n+1) = let
in
case+ pf1 of
| SNOCnil () => let
prval LENGTHnil () = pf2 in LENGTHcons (LENGTHnil ())
end
| SNOCcons (pf1) => let
prval LENGTHcons (pf2) = pf2
in LENGTHcons (lemma (pf1, pf2))
end
end
in
lemma (pf1, pf2)
end
prfun lemma_snoc_length
{xs:ilist}{x:int}{xsx:ilist}{n:int}
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)): LENGTH (xsx, n+1)
primplmnt lemma_snoc_length (pf1, pf2) = let
prfun lemma
{xs:ilist}{x:int}{xsx:ilist}{n:int} .<xs>.
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)):
LENGTH (xsx, n+1) = let
in
case+ pf1 of
| SNOCnil () => let
prval LENGTHnil () = pf2 in LENGTHcons (LENGTHnil ())
end
| SNOCcons (pf1) => let
prval LENGTHcons (pf2) = pf2
in LENGTHcons (lemma (pf1, pf2))
end
end
in
lemma (pf1, pf2)
end
prfun lemma_snoc_length
{xs:ilist}{x:int}{xsx:ilist}{n:int}
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)): LENGTH (xsx, n+1)
primplmnt lemma_snoc_length (pf1, pf2) = let
prfun lemma
{xs:ilist}{x:int}{xsx:ilist}{n:int} .<xs>.
(pf1: SNOC (xs, x, xsx), pf2: LENGTH (xs, n)):
LENGTH (xsx, n+1) = let
in
case+ pf1 of
| SNOCnil () => let
prval LENGTHnil () = pf2 in LENGTHcons (LENGTHnil ())
end
| SNOCcons (pf1) => let
prval LENGTHcons (pf2) = pf2
in LENGTHcons (lemma (pf1, pf2))
end
end
in
lemma (pf1, pf2)
end
24. Concrete listConcrete listConcrete listConcrete listConcrete list
https://github.com/githwxi/ATS-Postiats/tree/master/libats/SATShttps://github.com/githwxi/ATS-Postiats/tree/master/libats/SATShttps://github.com/githwxi/ATS-Postiats/tree/master/libats/SATShttps://github.com/githwxi/ATS-Postiats/tree/master/libats/SATShttps://github.com/githwxi/ATS-Postiats/tree/master/libats/SATS
☆ gflist.sats: with GC☆ gflist.sats: with GC☆ gflist.sats: with GC☆ gflist.sats: with GC☆ gflist.sats: with GC
☆ gflist_vt.sats: without GC, with malloc☆ gflist_vt.sats: without GC, with malloc☆ gflist_vt.sats: without GC, with malloc☆ gflist_vt.sats: without GC, with malloc☆ gflist_vt.sats: without GC, with malloc
☆ gfarray.sats: without GC and malloc☆ gfarray.sats: without GC and malloc☆ gfarray.sats: without GC and malloc☆ gfarray.sats: without GC and malloc☆ gfarray.sats: without GC and malloc
32. Use gflist_vt_append_lengthUse gflist_vt_append_lengthUse gflist_vt_append_lengthUse gflist_vt_append_lengthUse gflist_vt_append_length
implement main0 () = {
val l1 = $list_vt{int}(1, 2, 3)
val (pf1 | xs1) = list2gflist_vt l1
val l2 = $list_vt{int}(4, 3, 2, 1)
val (pf2 | xs2) = list2gflist_vt l2
val (pf_len, pf_append | xs3) =
gflist_vt_append_length (pf1, pf2 | xs1, xs2)
val (pf3 | l3) = gflist2list_vt xs3
val () = print_list_vt<int> l3
val () = free l3
}
implement main0 () = {
val l1 = $list_vt{int}(1, 2, 3)
val (pf1 | xs1) = list2gflist_vt l1
val l2 = $list_vt{int}(4, 3, 2, 1)
val (pf2 | xs2) = list2gflist_vt l2
val (pf_len, pf_append | xs3) =
gflist_vt_append_length (pf1, pf2 | xs1, xs2)
val (pf3 | l3) = gflist2list_vt xs3
val () = print_list_vt<int> l3
val () = free l3
}
implement main0 () = {
val l1 = $list_vt{int}(1, 2, 3)
val (pf1 | xs1) = list2gflist_vt l1
val l2 = $list_vt{int}(4, 3, 2, 1)
val (pf2 | xs2) = list2gflist_vt l2
val (pf_len, pf_append | xs3) =
gflist_vt_append_length (pf1, pf2 | xs1, xs2)
val (pf3 | l3) = gflist2list_vt xs3
val () = print_list_vt<int> l3
val () = free l3
}
implement main0 () = {
val l1 = $list_vt{int}(1, 2, 3)
val (pf1 | xs1) = list2gflist_vt l1
val l2 = $list_vt{int}(4, 3, 2, 1)
val (pf2 | xs2) = list2gflist_vt l2
val (pf_len, pf_append | xs3) =
gflist_vt_append_length (pf1, pf2 | xs1, xs2)
val (pf3 | l3) = gflist2list_vt xs3
val () = print_list_vt<int> l3
val () = free l3
}
implement main0 () = {
val l1 = $list_vt{int}(1, 2, 3)
val (pf1 | xs1) = list2gflist_vt l1
val l2 = $list_vt{int}(4, 3, 2, 1)
val (pf2 | xs2) = list2gflist_vt l2
val (pf_len, pf_append | xs3) =
gflist_vt_append_length (pf1, pf2 | xs1, xs2)
val (pf3 | l3) = gflist2list_vt xs3
val () = print_list_vt<int> l3
val () = free l3
}
Function "gflist_append_length" and
"gflist_vt_append_length" have same
structure, while one of them use GC
and another doesn't.
Function "gflist_append_length" and
"gflist_vt_append_length" have same
structure, while one of them use GC
and another doesn't.
Function "gflist_append_length" and
"gflist_vt_append_length" have same
structure, while one of them use GC
and another doesn't.
Function "gflist_append_length" and
"gflist_vt_append_length" have same
structure, while one of them use GC
and another doesn't.
Function "gflist_append_length" and
"gflist_vt_append_length" have same
structure, while one of them use GC
and another doesn't.
42. Function body using PAL #1Function body using PAL #1Function body using PAL #1Function body using PAL #1Function body using PAL #1
implement{a}
pal_empty () = (PALnil () | gflist_nil ())
implement{a}
pal_sing (x) = (PALone () | gflist_cons (x, gflist_nil))
implement{a}
print_pal (_ | xs) = let
val (_ | xs) = gflist2list xs
in
print_list<a> xs
end
implement{a}
pal_empty () = (PALnil () | gflist_nil ())
implement{a}
pal_sing (x) = (PALone () | gflist_cons (x, gflist_nil))
implement{a}
print_pal (_ | xs) = let
val (_ | xs) = gflist2list xs
in
print_list<a> xs
end
implement{a}
pal_empty () = (PALnil () | gflist_nil ())
implement{a}
pal_sing (x) = (PALone () | gflist_cons (x, gflist_nil))
implement{a}
print_pal (_ | xs) = let
val (_ | xs) = gflist2list xs
in
print_list<a> xs
end
implement{a}
pal_empty () = (PALnil () | gflist_nil ())
implement{a}
pal_sing (x) = (PALone () | gflist_cons (x, gflist_nil))
implement{a}
print_pal (_ | xs) = let
val (_ | xs) = gflist2list xs
in
print_list<a> xs
end
implement{a}
pal_empty () = (PALnil () | gflist_nil ())
implement{a}
pal_sing (x) = (PALone () | gflist_cons (x, gflist_nil))
implement{a}
print_pal (_ | xs) = let
val (_ | xs) = gflist2list xs
in
print_list<a> xs
end
43. Function body using PAL #2Function body using PAL #2Function body using PAL #2Function body using PAL #2Function body using PAL #2
implement{a}
pal_pappend (pfpal | pxs, xs) = let
fun loop {pxs,xs:ilist} .<xs>.
(pfpal: PAL (pxs) |
pxs: gflist (a, pxs), xs: gflist (a, xs)):
[pxsx:ilist] (PAL (pxsx), PAPPEND (pxs, xs, pxsx) |
gflist (a, pxsx)) =
case+ xs of
| gflist_nil () => (pfpal, PAPPENDnil pfpal | pxs)
| gflist_cons(x, xs1) => let
val (pfsnoc | pxs) = gflist_snoc (pxs, x)
val pxs = gflist_vt2t pxs
val (pfpalx, pfappend | pzs) =
loop (PALcons (pfpal, pfsnoc) | gflist_cons (x, pxs), xs1)
prval pfappendx = PAPPENDcons (pfsnoc, pfappend)
in
(pfpalx, pfappendx | pzs)
end
in
loop (pfpal | pxs, xs)
end
implement{a}
pal_pappend (pfpal | pxs, xs) = let
fun loop {pxs,xs:ilist} .<xs>.
(pfpal: PAL (pxs) |
pxs: gflist (a, pxs), xs: gflist (a, xs)):
[pxsx:ilist] (PAL (pxsx), PAPPEND (pxs, xs, pxsx) |
gflist (a, pxsx)) =
case+ xs of
| gflist_nil () => (pfpal, PAPPENDnil pfpal | pxs)
| gflist_cons(x, xs1) => let
val (pfsnoc | pxs) = gflist_snoc (pxs, x)
val pxs = gflist_vt2t pxs
val (pfpalx, pfappend | pzs) =
loop (PALcons (pfpal, pfsnoc) | gflist_cons (x, pxs), xs1)
prval pfappendx = PAPPENDcons (pfsnoc, pfappend)
in
(pfpalx, pfappendx | pzs)
end
in
loop (pfpal | pxs, xs)
end
implement{a}
pal_pappend (pfpal | pxs, xs) = let
fun loop {pxs,xs:ilist} .<xs>.
(pfpal: PAL (pxs) |
pxs: gflist (a, pxs), xs: gflist (a, xs)):
[pxsx:ilist] (PAL (pxsx), PAPPEND (pxs, xs, pxsx) |
gflist (a, pxsx)) =
case+ xs of
| gflist_nil () => (pfpal, PAPPENDnil pfpal | pxs)
| gflist_cons(x, xs1) => let
val (pfsnoc | pxs) = gflist_snoc (pxs, x)
val pxs = gflist_vt2t pxs
val (pfpalx, pfappend | pzs) =
loop (PALcons (pfpal, pfsnoc) | gflist_cons (x, pxs), xs1)
prval pfappendx = PAPPENDcons (pfsnoc, pfappend)
in
(pfpalx, pfappendx | pzs)
end
in
loop (pfpal | pxs, xs)
end
implement{a}
pal_pappend (pfpal | pxs, xs) = let
fun loop {pxs,xs:ilist} .<xs>.
(pfpal: PAL (pxs) |
pxs: gflist (a, pxs), xs: gflist (a, xs)):
[pxsx:ilist] (PAL (pxsx), PAPPEND (pxs, xs, pxsx) |
gflist (a, pxsx)) =
case+ xs of
| gflist_nil () => (pfpal, PAPPENDnil pfpal | pxs)
| gflist_cons(x, xs1) => let
val (pfsnoc | pxs) = gflist_snoc (pxs, x)
val pxs = gflist_vt2t pxs
val (pfpalx, pfappend | pzs) =
loop (PALcons (pfpal, pfsnoc) | gflist_cons (x, pxs), xs1)
prval pfappendx = PAPPENDcons (pfsnoc, pfappend)
in
(pfpalx, pfappendx | pzs)
end
in
loop (pfpal | pxs, xs)
end
implement{a}
pal_pappend (pfpal | pxs, xs) = let
fun loop {pxs,xs:ilist} .<xs>.
(pfpal: PAL (pxs) |
pxs: gflist (a, pxs), xs: gflist (a, xs)):
[pxsx:ilist] (PAL (pxsx), PAPPEND (pxs, xs, pxsx) |
gflist (a, pxsx)) =
case+ xs of
| gflist_nil () => (pfpal, PAPPENDnil pfpal | pxs)
| gflist_cons(x, xs1) => let
val (pfsnoc | pxs) = gflist_snoc (pxs, x)
val pxs = gflist_vt2t pxs
val (pfpalx, pfappend | pzs) =
loop (PALcons (pfpal, pfsnoc) | gflist_cons (x, pxs), xs1)
prval pfappendx = PAPPENDcons (pfsnoc, pfappend)
in
(pfpalx, pfappendx | pzs)
end
in
loop (pfpal | pxs, xs)
end
44. Application using PALApplication using PALApplication using PALApplication using PALApplication using PAL
implement main0 () = {
// Pullup
val (pfpal | lpal) = pal_empty ()
val (_ | l) = list2gflist $list{char}('L', 'U', 'P')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
// Devil never even lived.
val (pfpal | lpal) = pal_sing<char> (stamp_t 'R')
val (_ | l) = list2gflist
$list{char}('E', 'V', 'E', 'N', 'L', 'I', 'V', 'E', 'D')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
}
implement main0 () = {
// Pullup
val (pfpal | lpal) = pal_empty ()
val (_ | l) = list2gflist $list{char}('L', 'U', 'P')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
// Devil never even lived.
val (pfpal | lpal) = pal_sing<char> (stamp_t 'R')
val (_ | l) = list2gflist
$list{char}('E', 'V', 'E', 'N', 'L', 'I', 'V', 'E', 'D')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
}
implement main0 () = {
// Pullup
val (pfpal | lpal) = pal_empty ()
val (_ | l) = list2gflist $list{char}('L', 'U', 'P')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
// Devil never even lived.
val (pfpal | lpal) = pal_sing<char> (stamp_t 'R')
val (_ | l) = list2gflist
$list{char}('E', 'V', 'E', 'N', 'L', 'I', 'V', 'E', 'D')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
}
implement main0 () = {
// Pullup
val (pfpal | lpal) = pal_empty ()
val (_ | l) = list2gflist $list{char}('L', 'U', 'P')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
// Devil never even lived.
val (pfpal | lpal) = pal_sing<char> (stamp_t 'R')
val (_ | l) = list2gflist
$list{char}('E', 'V', 'E', 'N', 'L', 'I', 'V', 'E', 'D')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
}
implement main0 () = {
// Pullup
val (pfpal | lpal) = pal_empty ()
val (_ | l) = list2gflist $list{char}('L', 'U', 'P')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
// Devil never even lived.
val (pfpal | lpal) = pal_sing<char> (stamp_t 'R')
val (_ | l) = list2gflist
$list{char}('E', 'V', 'E', 'N', 'L', 'I', 'V', 'E', 'D')
val (pfpal, _ | lpal) = pal_pappend (pfpal | lpal, l)
val () = print_pal<char> (pfpal | lpal)
val () = print "n"
}
$ patscc main.dats -DATS_MEMALLOC_LIBC
$ ./a.out
P, U, L, L, U, P
D, E, V, I, L, N, E, V, E, R, E, V, E, N, L, I, V, E, D
$ patscc main.dats -DATS_MEMALLOC_LIBC
$ ./a.out
P, U, L, L, U, P
D, E, V, I, L, N, E, V, E, R, E, V, E, N, L, I, V, E, D
$ patscc main.dats -DATS_MEMALLOC_LIBC
$ ./a.out
P, U, L, L, U, P
D, E, V, I, L, N, E, V, E, R, E, V, E, N, L, I, V, E, D
$ patscc main.dats -DATS_MEMALLOC_LIBC
$ ./a.out
P, U, L, L, U, P
D, E, V, I, L, N, E, V, E, R, E, V, E, N, L, I, V, E, D
$ patscc main.dats -DATS_MEMALLOC_LIBC
$ ./a.out
P, U, L, L, U, P
D, E, V, I, L, N, E, V, E, R, E, V, E, N, L, I, V, E, D
45. Future of ATS/LFFuture of ATS/LFFuture of ATS/LFFuture of ATS/LFFuture of ATS/LF
☆ William Blair is trying to use Z3 SMT
solver as external solver of ATS
compiler.
☆ William Blair is trying to use Z3 SMT
solver as external solver of ATS
compiler.
☆ William Blair is trying to use Z3 SMT
solver as external solver of ATS
compiler.
☆ William Blair is trying to use Z3 SMT
solver as external solver of ATS
compiler.
☆ William Blair is trying to use Z3 SMT
solver as external solver of ATS
compiler.
https://github.com/Z3Prover/z3/
http://cs-people.bu.edu/wdblair/
http://www.illtyped.com/
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/index.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/qsort.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/scripting.md
https://github.com/Z3Prover/z3/
http://cs-people.bu.edu/wdblair/
http://www.illtyped.com/
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/index.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/qsort.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/scripting.md
https://github.com/Z3Prover/z3/
http://cs-people.bu.edu/wdblair/
http://www.illtyped.com/
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/index.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/qsort.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/scripting.md
https://github.com/Z3Prover/z3/
http://cs-people.bu.edu/wdblair/
http://www.illtyped.com/
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/index.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/qsort.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/scripting.md
https://github.com/Z3Prover/z3/
http://cs-people.bu.edu/wdblair/
http://www.illtyped.com/
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/index.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/qsort.md
https://github.com/jats-ug/translate/blob/master/Web/
www.illtyped.com/projects/patsolve/scripting.md
☆ Proving on ATS/LF will be semi-
automated by the external solver.
☆ Proving on ATS/LF will be semi-
automated by the external solver.
☆ Proving on ATS/LF will be semi-
automated by the external solver.
☆ Proving on ATS/LF will be semi-
automated by the external solver.
☆ Proving on ATS/LF will be semi-
automated by the external solver.
46. For more detailFor more detailFor more detailFor more detailFor more detail
Read "Functional Ikamusume" book!Read "Functional Ikamusume" book!Read "Functional Ikamusume" book!Read "Functional Ikamusume" book!Read "Functional Ikamusume" book!
http://www.paraiso-lang.org/ikmsm/books/c88.htmlhttp://www.paraiso-lang.org/ikmsm/books/c88.htmlhttp://www.paraiso-lang.org/ikmsm/books/c88.htmlhttp://www.paraiso-lang.org/ikmsm/books/c88.htmlhttp://www.paraiso-lang.org/ikmsm/books/c88.html
47. Join "Japan ATS User Group" !Join "Japan ATS User Group" !Join "Japan ATS User Group" !Join "Japan ATS User Group" !Join "Japan ATS User Group" !
http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/http://jats-ug.metasepi.org/
We translate following ATS documents
into Japanese.
We translate following ATS documents
into Japanese.
We translate following ATS documents
into Japanese.
We translate following ATS documents
into Japanese.
We translate following ATS documents
into Japanese.
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
* ATSプログラミング入門
http://jats-ug.metasepi.org/doc/ATS2/INT2PROGINATS/
* ATSプログラミングチュートリアル
http://jats-ug.metasepi.org/doc/ATS2/ATS2TUTORIAL/
* Effective ATS
https://github.com/jats-ug/translate/blob/master/Manual/
EffectiveATS.md
Join us and review it!Join us and review it!Join us and review it!Join us and review it!Join us and review it!
48. License of photos #1License of photos #1License of photos #1License of photos #1License of photos #1
* Logical Machine | Flickr - Photo Sharing!
https://www.flickr.com/photos/christopherbrown/10256940256/
Copyright: Christopher Brown / License: CC BY 2.0
* いなばの缶詰タイカレー チキンレッド | Flickr - Photo Sharing!
https://www.flickr.com/photos/yto/8492272580/
Copyright: Tatsuo Yamashita / License: CC BY 2.0
* starched collars | Flickr - Photo Sharing!
https://www.flickr.com/photos/dps/57697411/
Copyright: David Singleton / License: CC BY 2.0
* Spanish dictionary pages up into the air | Flickr - Photo
Sharing!
https://www.flickr.com/photos/horiavarlan/4268897748/
Copyright: Horia Varlan / License: CC BY 2.0
* Puyo Puyo 20th Anniversary (DS) | Flickr - Photo Sharing!
https://www.flickr.com/photos/bochalla/8557746185/
Copyright: Bryan Ochalla / License: CC BY-SA 2.0
* 吉田口5合目でソフトクリーム, 富士山登山(吉田ルート) Climb Mt.Fuji
(Yoshida Trail) | Flickr - Photo Sharing!
https://www.flickr.com/photos/jetalone/4914427291/
Copyright: Hajime NAKANO / License: CC BY 2.0
* Logical Machine | Flickr - Photo Sharing!
https://www.flickr.com/photos/christopherbrown/10256940256/
Copyright: Christopher Brown / License: CC BY 2.0
* いなばの缶詰タイカレー チキンレッド | Flickr - Photo Sharing!
https://www.flickr.com/photos/yto/8492272580/
Copyright: Tatsuo Yamashita / License: CC BY 2.0
* starched collars | Flickr - Photo Sharing!
https://www.flickr.com/photos/dps/57697411/
Copyright: David Singleton / License: CC BY 2.0
* Spanish dictionary pages up into the air | Flickr - Photo
Sharing!
https://www.flickr.com/photos/horiavarlan/4268897748/
Copyright: Horia Varlan / License: CC BY 2.0
* Puyo Puyo 20th Anniversary (DS) | Flickr - Photo Sharing!
https://www.flickr.com/photos/bochalla/8557746185/
Copyright: Bryan Ochalla / License: CC BY-SA 2.0
* 吉田口5合目でソフトクリーム, 富士山登山(吉田ルート) Climb Mt.Fuji
(Yoshida Trail) | Flickr - Photo Sharing!
https://www.flickr.com/photos/jetalone/4914427291/
Copyright: Hajime NAKANO / License: CC BY 2.0
* Logical Machine | Flickr - Photo Sharing!
https://www.flickr.com/photos/christopherbrown/10256940256/
Copyright: Christopher Brown / License: CC BY 2.0
* いなばの缶詰タイカレー チキンレッド | Flickr - Photo Sharing!
https://www.flickr.com/photos/yto/8492272580/
Copyright: Tatsuo Yamashita / License: CC BY 2.0
* starched collars | Flickr - Photo Sharing!
https://www.flickr.com/photos/dps/57697411/
Copyright: David Singleton / License: CC BY 2.0
* Spanish dictionary pages up into the air | Flickr - Photo
Sharing!
https://www.flickr.com/photos/horiavarlan/4268897748/
Copyright: Horia Varlan / License: CC BY 2.0
* Puyo Puyo 20th Anniversary (DS) | Flickr - Photo Sharing!
https://www.flickr.com/photos/bochalla/8557746185/
Copyright: Bryan Ochalla / License: CC BY-SA 2.0
* 吉田口5合目でソフトクリーム, 富士山登山(吉田ルート) Climb Mt.Fuji
(Yoshida Trail) | Flickr - Photo Sharing!
https://www.flickr.com/photos/jetalone/4914427291/
Copyright: Hajime NAKANO / License: CC BY 2.0
* Logical Machine | Flickr - Photo Sharing!
https://www.flickr.com/photos/christopherbrown/10256940256/
Copyright: Christopher Brown / License: CC BY 2.0
* いなばの缶詰タイカレー チキンレッド | Flickr - Photo Sharing!
https://www.flickr.com/photos/yto/8492272580/
Copyright: Tatsuo Yamashita / License: CC BY 2.0
* starched collars | Flickr - Photo Sharing!
https://www.flickr.com/photos/dps/57697411/
Copyright: David Singleton / License: CC BY 2.0
* Spanish dictionary pages up into the air | Flickr - Photo
Sharing!
https://www.flickr.com/photos/horiavarlan/4268897748/
Copyright: Horia Varlan / License: CC BY 2.0
* Puyo Puyo 20th Anniversary (DS) | Flickr - Photo Sharing!
https://www.flickr.com/photos/bochalla/8557746185/
Copyright: Bryan Ochalla / License: CC BY-SA 2.0
* 吉田口5合目でソフトクリーム, 富士山登山(吉田ルート) Climb Mt.Fuji
(Yoshida Trail) | Flickr - Photo Sharing!
https://www.flickr.com/photos/jetalone/4914427291/
Copyright: Hajime NAKANO / License: CC BY 2.0
* Logical Machine | Flickr - Photo Sharing!
https://www.flickr.com/photos/christopherbrown/10256940256/
Copyright: Christopher Brown / License: CC BY 2.0
* いなばの缶詰タイカレー チキンレッド | Flickr - Photo Sharing!
https://www.flickr.com/photos/yto/8492272580/
Copyright: Tatsuo Yamashita / License: CC BY 2.0
* starched collars | Flickr - Photo Sharing!
https://www.flickr.com/photos/dps/57697411/
Copyright: David Singleton / License: CC BY 2.0
* Spanish dictionary pages up into the air | Flickr - Photo
Sharing!
https://www.flickr.com/photos/horiavarlan/4268897748/
Copyright: Horia Varlan / License: CC BY 2.0
* Puyo Puyo 20th Anniversary (DS) | Flickr - Photo Sharing!
https://www.flickr.com/photos/bochalla/8557746185/
Copyright: Bryan Ochalla / License: CC BY-SA 2.0
* 吉田口5合目でソフトクリーム, 富士山登山(吉田ルート) Climb Mt.Fuji
(Yoshida Trail) | Flickr - Photo Sharing!
https://www.flickr.com/photos/jetalone/4914427291/
Copyright: Hajime NAKANO / License: CC BY 2.0
49. License of photos #2License of photos #2License of photos #2License of photos #2License of photos #2
* Chicken | Flickr - Photo Sharing!
https://www.flickr.com/photos/mcbarnicle/7429834398/
Copyright: SMcGarnigle / License: CC BY 2.0
* Martin Fowler | Flickr - Photo Sharing!
https://www.flickr.com/photos/adewale_oshineye/2933030620/
Copyright: Ade Oshineye / License: CC BY 2.0
* keeping busy 07.21.06 | Flickr - Photo Sharing!
https://www.flickr.com/photos/35188692@N00/195756672/
Copyright: Alan L / License: CC BY 2.0
* Blueprint | Flickr - Photo Sharing!
https://www.flickr.com/photos/wscullin/3770015203/
Copyright: Will Scullin / License: CC BY 2.0
* Gu-Guガンモ? | Flickr - Photo Sharing!
https://www.flickr.com/photos/isinoid/5447894242/
Copyright: Hiroshi Ishii / License: CC BY 2.0
* Back In Time | Flickr - Photo Sharing!
https://www.flickr.com/photos/jdhancock/4100030094/
Copyright: JD Hancock / License: CC BY 2.0
* Chicken | Flickr - Photo Sharing!
https://www.flickr.com/photos/mcbarnicle/7429834398/
Copyright: SMcGarnigle / License: CC BY 2.0
* Martin Fowler | Flickr - Photo Sharing!
https://www.flickr.com/photos/adewale_oshineye/2933030620/
Copyright: Ade Oshineye / License: CC BY 2.0
* keeping busy 07.21.06 | Flickr - Photo Sharing!
https://www.flickr.com/photos/35188692@N00/195756672/
Copyright: Alan L / License: CC BY 2.0
* Blueprint | Flickr - Photo Sharing!
https://www.flickr.com/photos/wscullin/3770015203/
Copyright: Will Scullin / License: CC BY 2.0
* Gu-Guガンモ? | Flickr - Photo Sharing!
https://www.flickr.com/photos/isinoid/5447894242/
Copyright: Hiroshi Ishii / License: CC BY 2.0
* Back In Time | Flickr - Photo Sharing!
https://www.flickr.com/photos/jdhancock/4100030094/
Copyright: JD Hancock / License: CC BY 2.0
* Chicken | Flickr - Photo Sharing!
https://www.flickr.com/photos/mcbarnicle/7429834398/
Copyright: SMcGarnigle / License: CC BY 2.0
* Martin Fowler | Flickr - Photo Sharing!
https://www.flickr.com/photos/adewale_oshineye/2933030620/
Copyright: Ade Oshineye / License: CC BY 2.0
* keeping busy 07.21.06 | Flickr - Photo Sharing!
https://www.flickr.com/photos/35188692@N00/195756672/
Copyright: Alan L / License: CC BY 2.0
* Blueprint | Flickr - Photo Sharing!
https://www.flickr.com/photos/wscullin/3770015203/
Copyright: Will Scullin / License: CC BY 2.0
* Gu-Guガンモ? | Flickr - Photo Sharing!
https://www.flickr.com/photos/isinoid/5447894242/
Copyright: Hiroshi Ishii / License: CC BY 2.0
* Back In Time | Flickr - Photo Sharing!
https://www.flickr.com/photos/jdhancock/4100030094/
Copyright: JD Hancock / License: CC BY 2.0
* Chicken | Flickr - Photo Sharing!
https://www.flickr.com/photos/mcbarnicle/7429834398/
Copyright: SMcGarnigle / License: CC BY 2.0
* Martin Fowler | Flickr - Photo Sharing!
https://www.flickr.com/photos/adewale_oshineye/2933030620/
Copyright: Ade Oshineye / License: CC BY 2.0
* keeping busy 07.21.06 | Flickr - Photo Sharing!
https://www.flickr.com/photos/35188692@N00/195756672/
Copyright: Alan L / License: CC BY 2.0
* Blueprint | Flickr - Photo Sharing!
https://www.flickr.com/photos/wscullin/3770015203/
Copyright: Will Scullin / License: CC BY 2.0
* Gu-Guガンモ? | Flickr - Photo Sharing!
https://www.flickr.com/photos/isinoid/5447894242/
Copyright: Hiroshi Ishii / License: CC BY 2.0
* Back In Time | Flickr - Photo Sharing!
https://www.flickr.com/photos/jdhancock/4100030094/
Copyright: JD Hancock / License: CC BY 2.0
* Chicken | Flickr - Photo Sharing!
https://www.flickr.com/photos/mcbarnicle/7429834398/
Copyright: SMcGarnigle / License: CC BY 2.0
* Martin Fowler | Flickr - Photo Sharing!
https://www.flickr.com/photos/adewale_oshineye/2933030620/
Copyright: Ade Oshineye / License: CC BY 2.0
* keeping busy 07.21.06 | Flickr - Photo Sharing!
https://www.flickr.com/photos/35188692@N00/195756672/
Copyright: Alan L / License: CC BY 2.0
* Blueprint | Flickr - Photo Sharing!
https://www.flickr.com/photos/wscullin/3770015203/
Copyright: Will Scullin / License: CC BY 2.0
* Gu-Guガンモ? | Flickr - Photo Sharing!
https://www.flickr.com/photos/isinoid/5447894242/
Copyright: Hiroshi Ishii / License: CC BY 2.0
* Back In Time | Flickr - Photo Sharing!
https://www.flickr.com/photos/jdhancock/4100030094/
Copyright: JD Hancock / License: CC BY 2.0