Giter VIP home page Giter VIP logo

structtact's Introduction

StructTact

Docker CI

StructTact is a Coq library of structural tactics as well as lemmas about lists, finite types, and orders on strings that use the tactics. The structural tactics enable a style of proof where hypothesis names are never mentioned. When automatically generated names change during proof development, structural tactics will still work.

Meta

Building and installation instructions

The easiest way to install StructTact is via OPAM:

opam repo add coq-extra-dev https://coq.inria.fr/opam/extra-dev
opam install coq-struct-tact

To instead build and install manually, do:

git clone https://github.com/uwplse/StructTact.git
cd StructTact
make   # or make -j <number-of-cores-on-your-machine>
make install

Documentation

StructTact consists mainly of files originally developed as part of the Verdi framework, which have here been adapted for easier reuse in other projects.

Structural tactics

The structural tactics are found in the file StructTactics.v, and are named by analogy to the structural properties of simple type systems: weakening, exchange, and contraction. In the context of proof assistants, these are analogous to the ability to add new hypotheses in the context, reorder existing hypotheses, and delete unused hypotheses. Theoretically, Coq inherits these properties from the underlying type system, but in practice, automatically generated hypothesis names cause proof scripts to break when the context is adjusted in seemingly irrelevant ways.

Structural tactics restore these properties at the level of Ltac by enabling a style of proof where hypothesis names are never mentioned. When automatically generated names change during proof development, structural tactics still work.

For tactic documentation, see the inline comments in StructTactics.v.

Utility definitions and lemmas

The file Util.v collects definitions, lemmas, and tactics about lists, booleans, propositions, and functions that were useful in other projects. Notably, the following files are exported:

  • BoolUtil.v: general boolean lemmas, tactics, and definitions
  • PropUtil.v: general lemmas about propositions and sum types
  • Update.v: function update that modifies a function to return a new value for a specific argument
  • Update2.v: function update2 that modifies a function to return a new value for specific pair of arguments
  • ListTactics.v: tactics operating on contexts with map, NoDup, and In
  • ListUtil.v: general list lemmas, involving, e.g., NoDup, map, filter, and firstn
  • Assoc.v: association lists with get, set, and delete functions
  • Before.v: relation before capturing when an element appears before another in a list
  • Dedup.v: function dedup remove duplicates from a list using decidable equality
  • FilterMap.v: function filterMap that maps a partial function on a list and ignores failures
  • Nth.v: relation Nth capturing the element at some position in a list
  • Prefix.v: relation Prefix capturing when one list is a prefix of another
  • RemoveAll.v: function remove_all which removes all elements of one list from another; set subtraction
  • Subseq.v: relation subseq capturing when one list is a subsequence of another

Finite types

The file Fin.v contains definitions and lemmas related to fin n, a type with n elements, isomorphic to Fin.t n from the standard library, but with a slightly different definition that is more convenient to work with.

The following constructions are defined on fin:

  • fin_eq_dec: decidable equality
  • all_fin n: list of all elements of fin n
  • fin_to_nat: convert a fin n to a nat
  • fin_lt: an ordering on fin n, implemented using fin_to_nat
  • fin_OT_compat: legacy OrderedType module for fin n (for use with FMap)
  • fin_OT: modern OrderedType module for fin n (for use with MSet)
  • fin_of_nat: convert a nat to a fin n, when possible

String orders

The file StringOrders.v contains some order relations on strings, in particular a total lexicographic order.

The following modules are defined:

  • string_lex_as_OT_compat: legacy OrderedType module for string (for use with FMap)
  • string_lex_as_OT: modern OrderedType module for string (for use with MSet)

structtact's People

Contributors

alizter avatar dwoos avatar hackedy avatar jfehrle avatar kethku avatar palmskog avatar ptival avatar sliverdragon37 avatar vzaliva avatar wilcoxjay avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

structtact's Issues

Make find_rewrite consistent

find_rewrite currently has 4 cases which all have weird idiosyncrasies. Most glaring is the first case with 4 arguments. This should be cleaned up and tested on the verdi codebase

installation fails

I get this error when I run the instructions here:

(meta_learning) brandomiranda~/StructTact ❯ opam repo add coq-extra-dev https://coq.inria.fr/opam/extra-dev
opam install coq-struct-tact
Processing  1/1: [coq-extra-dev: http]

[coq-extra-dev] synchronised from https://coq.inria.fr/opam/extra-dev
[NOTE] Repository coq-extra-dev has been added to the selections of switch __coq-platform.2022.01.0~8.14~2022.01 only.
       Run `opam repository add coq-extra-dev --all-switches|--set-default' to use it in all existing switches, or in newly created switches, respectively.

[WARNING] Opam package conf-python-3.9.0.0 depends on the following system package that can no longer be found: python@3
The following actions will be performed:
  ⊘ remove    coq-mathcomp-zify         1.1.0+1.12+8.13                [conflicts with coq]
  ⊘ remove    coq-mtac2                 1.4+8.14                       [conflicts with coq]
  ⊘ remove    coq-unimath               20210807                       [conflicts with coq]
  ↘ downgrade elpi                      1.13.7 to 1.11.2               [required by coq-elpi]
  ⊘ remove    coq-unicoq                1.6+8.14                       [conflicts with coq]
  ↘ downgrade coq                       8.14.1 to 8.11.2               [required by coq-struct-tact]
  ∗ install   coq-struct-tact           dev
  ↗ upgrade   coq-stdpp                 1.6.0 to dev                   [uses coq]
  ↻ recompile coq-menhirlib             20211012                       [uses coq]
  ↻ recompile coq-mathcomp-ssreflect    1.13.0                         [uses coq]
  ↻ recompile coq-libhyps               2.0.4                          [uses coq]
  ↻ recompile coq-flocq                 3.4.2                          [uses coq]
  ↻ recompile coq-ext-lib               0.11.4                         [uses coq]
  ↘ downgrade coq-paramcoq              1.1.3+coq8.14 to 1.1.3+coq8.11 [uses coq]
  ↘ downgrade coq-hott                  8.14 to 8.11.dev               [uses coq]
  ↘ downgrade coq-hammer-tactics        1.3.2+8.14 to 1.3.2+8.11       [uses coq]
  ↘ downgrade coq-equations             1.3+8.14 to 1.2.4+8.11         [uses coq]
  ↘ downgrade coq-elpi                  1.11.2 to 1.6.2~8.11           [uses coq]
  ↘ downgrade coq-dpdgraph              1.0+8.14 to 0.6.7              [uses coq]
  ↘ downgrade coq-bignums               8.14.0 to 8.11.dev             [uses coq]
  ↘ downgrade coq-aac-tactics           8.14.1 to 8.11.0               [uses coq]
  ↘ downgrade coq-iris                  3.5.0 to 3.4.0                 [uses coq]
  ↻ recompile coq-reglang               1.1.2                          [uses coq]
  ↻ recompile coq-mathcomp-finmap       1.5.1                          [uses coq]
  ↻ recompile coq-mathcomp-fingroup     1.13.0                         [uses coq-mathcomp-ssreflect]
  ↻ recompile coq-mathcomp-bigenough    1.0.0                          [uses coq]
  ↻ recompile coq-coquelicot            3.2.0                          [uses coq]
  ↗ upgrade   coq-vst                   2.8 to dev                     [uses coq]
  ↻ recompile coq-gappa                 1.5.0                          [uses coq]
  ↻ recompile coq-compcert              3.9                            [uses coq]
  ↻ recompile coq-simple-io             1.6.0                          [uses coq]
  ↘ downgrade coq-hammer                1.3.2+8.14 to 1.3.2+8.11       [uses coq]
  ↘ downgrade coq-hierarchy-builder     1.2.0 to 1.1.0                 [required by coq-mathcomp-analysis]
  ↗ upgrade   coq-coqprime              1.1.1 to dev                   [uses coq]
  ↻ recompile coq-math-classes          8.13.0                         [uses coq]
  ↘ downgrade coq-iris-heap-lang        3.5.0 to 3.4.0                 [uses coq-iris]
  ↻ recompile coq-mathcomp-algebra      1.13.0                         [uses coq-mathcomp-zify]
  ↻ recompile coq-interval              4.3.0                          [uses coq]
  ↻ recompile coq-quickchick            1.6.0                          [uses coq]
  ↻ recompile coq-corn                  8.13.0                         [uses coq]
  ↻ recompile coq-mathcomp-solvable     1.13.0                         [uses coq-mathcomp-algebra]
  ↻ recompile coq-mathcomp-multinomials 1.5.4                          [uses coq]
  ↻ recompile coq-mathcomp-field        1.13.0                         [uses coq-mathcomp-solvable]
  ↻ recompile coq-mathcomp-real-closed  1.1.2                          [uses coq]
  ↻ recompile coq-mathcomp-character    1.13.0                         [uses coq-mathcomp-field]
  ↻ recompile coq-mathcomp-analysis     0.3.11                         [uses coq]
  ↻ recompile coq-coqeal                1.1.0                          [uses coq]
===== ∗ 1   ↻ 25   ↗ 3   ↘ 14   ⊘ 4 =====
Do you want to continue? [Y/n] y


<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><>  🐫 
⊘ removed   coq-mathcomp-zify.1.1.0+1.12+8.13
⊘ removed   coq-mtac2.1.4+8.14
⊘ removed   coq-unicoq.1.6+8.14
⊘ removed   coq-unimath.20210807
⬇ retrieved coq-aac-tactics.8.11.0  (https://github.com/coq-community/aac-tactics/archive/v8.11.0.tar.gz)
⬇ retrieved coq-compcert.3.9  (cached)
⬇ retrieved coq-coqeal.1.1.0  (cached)
⬇ retrieved coq.8.11.2  (https://opam.ocaml.org/cache)
⬇ retrieved coq-coquelicot.3.2.0  (cached)
⬇ retrieved coq-bignums.8.11.dev  (git+https://github.com/coq/bignums.git#v8.11)
⬇ retrieved coq-corn.8.13.0  (cached)
⬇ retrieved coq-dpdgraph.0.6.7  (https://github.com/Karmaki/coq-dpdgraph/releases/download/v0.6.7/coq-dpdgraph-0.6.7.tgz)
⬇ retrieved coq-elpi.1.6.2~8.11  (https://github.com/LPCIC/coq-elpi/archive/v1.6.2_8.11.tar.gz)
⬇ retrieved coq-ext-lib.0.11.4  (cached)
⬇ retrieved coq-flocq.3.4.2  (cached)
⬇ retrieved coq-gappa.1.5.0  (cached)
⬇ retrieved coq-coqprime.dev  (git+https://github.com/thery/coqprime.git#master)
⬇ retrieved coq-equations.1.2.4+8.11  (https://github.com/mattam82/Coq-Equations/archive/v1.2.4-8.11.tar.gz)
⬇ retrieved coq-hammer-tactics.1.3.2+8.11  (https://github.com/lukaszcz/coqhammer/archive/refs/tags/v1.3.2-coq8.11.tar.gz)
⬇ retrieved coq-hammer.1.3.2+8.11  (https://github.com/lukaszcz/coqhammer/archive/refs/tags/v1.3.2-coq8.11.tar.gz)
⬇ retrieved coq-interval.4.3.0  (cached)
⬇ retrieved coq-hierarchy-builder.1.1.0  (https://github.com/math-comp/hierarchy-builder/archive/v1.1.0.tar.gz)
⬇ retrieved coq-iris.3.4.0  (https://gitlab.mpi-sws.org/iris/iris/-/archive/iris-3.4.0.tar.gz)
⬇ retrieved coq-libhyps.2.0.4  (cached)
⬇ retrieved coq-math-classes.8.13.0  (cached)
⬇ retrieved coq-mathcomp-algebra.1.13.0  (cached)
⬇ retrieved coq-iris-heap-lang.3.4.0  (https://gitlab.mpi-sws.org/iris/iris/-/archive/iris-3.4.0.tar.gz)
⬇ retrieved coq-mathcomp-analysis.0.3.11  (cached)
⬇ retrieved coq-mathcomp-bigenough.1.0.0  (cached)
⬇ retrieved coq-mathcomp-character.1.13.0  (cached)
⬇ retrieved coq-mathcomp-field.1.13.0  (cached)
⬇ retrieved coq-mathcomp-fingroup.1.13.0  (cached)
⬇ retrieved coq-mathcomp-finmap.1.5.1  (cached)
⬇ retrieved coq-mathcomp-multinomials.1.5.4  (cached)
⬇ retrieved coq-mathcomp-real-closed.1.1.2  (cached)
⬇ retrieved coq-mathcomp-solvable.1.13.0  (cached)
⬇ retrieved coq-mathcomp-ssreflect.1.13.0  (cached)
⬇ retrieved coq-menhirlib.20211012  (cached)
⬇ retrieved coq-quickchick.1.6.0  (cached)
⬇ retrieved coq-reglang.1.1.2  (cached)
⬇ retrieved coq-simple-io.1.6.0  (cached)
⬇ retrieved coq-paramcoq.1.1.3+coq8.11  (https://github.com/coq-community/paramcoq/archive/v1.1.3+coq8.11.tar.gz)
⬇ retrieved coq-stdpp.dev  (git+https://gitlab.mpi-sws.org/iris/stdpp.git)
⬇ retrieved coq-struct-tact.dev  (git+https://github.com/uwplse/StructTact.git#master)
⬇ retrieved coq-hott.8.11.dev  (git+https://github.com/HoTT/HoTT.git#V8.11)
⬇ retrieved coq-vst.dev  (git+https://github.com/PrincetonUniversity/VST.git#master)
⬇ retrieved elpi.1.11.2  (https://opam.ocaml.org/cache)
[ERROR] The compilation of elpi.1.11.2 failed at "make build DUNE_OPTS=-p elpi -j 16".
⊘ removed   coq-aac-tactics.8.14.1
⊘ removed   coq-coqeal.1.1.0
⊘ removed   coq-coqprime.1.1.1
⊘ removed   coq-corn.8.13.0
⊘ removed   coq-dpdgraph.1.0+8.14
⊘ removed   coq-equations.1.3+8.14
⊘ removed   coq-gappa.1.5.0
⊘ removed   coq-hammer.1.3.2+8.14
⊘ removed   coq-hammer-tactics.1.3.2+8.14
⊘ removed   coq-hott.8.14
⊘ removed   coq-interval.4.3.0
⊘ removed   coq-coquelicot.3.2.0
⊘ removed   coq-iris-heap-lang.3.5.0
⊘ removed   coq-iris.3.5.0
⊘ removed   coq-libhyps.2.0.4
⊘ removed   coq-math-classes.8.13.0
⊘ removed   coq-bignums.8.14.0
⊘ removed   coq-mathcomp-character.1.13.0
⊘ removed   coq-mathcomp-multinomials.1.5.4
⊘ removed   coq-mathcomp-real-closed.1.1.2
⊘ removed   coq-paramcoq.1.1.3+coq8.14
⊘ removed   coq-quickchick.1.6.0
⊘ removed   coq-reglang.1.1.2
⊘ removed   coq-simple-io.1.6.0
⊘ removed   coq-ext-lib.0.11.4
⊘ removed   coq-stdpp.1.6.0
⊘ removed   coq-vst.2.8
⊘ removed   coq-compcert.3.9
⊘ removed   coq-flocq.3.4.2
⊘ removed   coq-menhirlib.20211012

#=== ERROR while compiling elpi.1.11.2 ========================================#
# context     2.1.2 | macos/arm64 | ocaml-base-compiler.4.10.2 | https://opam.ocaml.org#ae76a8bc
# path        ~/.opam/__coq-platform.2022.01.0~8.14~2022.01/.opam-switch/build/elpi.1.11.2
# command     ~/.opam/opam-init/hooks/sandbox.sh build make build DUNE_OPTS=-p elpi -j 16
# exit-code   2
# env-file    ~/.opam/log/elpi-49927-019828.env
# output-file ~/.opam/log/elpi-49927-019828.out
### output ###
# [...]
# (cd _build/default && ../install/default/bin/ppxfindcache_deriving_std src/compiler.mli --cache-file src/.ppcache/API.ml --cache-file src/.ppcache/API.mli --cache-file src/.ppcache/util.ml --cache-file src/.ppcache/util.mli --cache-file src/.ppcache/ast.ml --cache-file src/.ppcache/ast.mli --cache-file src/.ppcache/data.ml --cache-file src/.ppcache/compiler.ml --cache-file src/.ppcache/compil[...]
# ppxfindcache_deriving_std src/data.pp.ml (exit 1)
# (cd _build/default && ../install/default/bin/ppxfindcache_deriving_std src/data.ml --cache-file src/.ppcache/API.ml --cache-file src/.ppcache/API.mli --cache-file src/.ppcache/util.ml --cache-file src/.ppcache/util.mli --cache-file src/.ppcache/ast.ml --cache-file src/.ppcache/ast.mli --cache-file src/.ppcache/data.ml --cache-file src/.ppcache/compiler.ml --cache-file src/.ppcache/compiler.ml[...]
# ppxfindcache_elpi_trace_deriving_std src/runtime_trace_off.pp.ml (exit 1)
# (cd _build/default && ../install/default/bin/ppxfindcache_elpi_trace_deriving_std src/runtime_trace_off.ml --ppx-opt --cookie --ppx-opt 'elpi_trace="false"' --cache-file src/.ppcache/runtime_trace_off.ml --cache-file src/.ppcache/runtime_trace_off.mli) > _build/default/src/runtime_trace_off.pp.ml
# ppxfindcache_elpi_trace_deriving_std src/runtime_trace_off.pp.mli (exit 1)
# (cd _build/default && ../install/default/bin/ppxfindcache_elpi_trace_deriving_std src/runtime_trace_off.mli --ppx-opt --cookie --ppx-opt 'elpi_trace="false"' --cache-file src/.ppcache/runtime_trace_off.ml --cache-file src/.ppcache/runtime_trace_off.mli) > _build/default/src/runtime_trace_off.pp.mli
# ppxfindcache_elpi_trace_deriving_std src/runtime_trace_on.pp.ml (exit 1)
# (cd _build/default && ../install/default/bin/ppxfindcache_elpi_trace_deriving_std src/runtime_trace_on.ml --ppx-opt --cookie --ppx-opt 'elpi_trace="true"' --cache-file src/.ppcache/runtime_trace_on.ml --cache-file src/.ppcache/runtime_trace_on.mli) > _build/default/src/runtime_trace_on.pp.ml
# ppxfindcache_elpi_trace_deriving_std src/runtime_trace_on.pp.mli (exit 1)
# (cd _build/default && ../install/default/bin/ppxfindcache_elpi_trace_deriving_std src/runtime_trace_on.mli --ppx-opt --cookie --ppx-opt 'elpi_trace="true"' --cache-file src/.ppcache/runtime_trace_on.ml --cache-file src/.ppcache/runtime_trace_on.mli) > _build/default/src/runtime_trace_on.pp.mli
# make: *** [build] Error 1



<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><>  🐫 
┌─ The following actions failed
│ λ build elpi 1.11.2
└─ 
┌─ The following changes have been performed (the rest was aborted)
│ ⊘ remove coq-aac-tactics           8.14.1
│ ⊘ remove coq-bignums               8.14.0
│ ⊘ remove coq-compcert              3.9
│ ⊘ remove coq-coqeal                1.1.0
│ ⊘ remove coq-coqprime              1.1.1
│ ⊘ remove coq-coquelicot            3.2.0
│ ⊘ remove coq-corn                  8.13.0
│ ⊘ remove coq-dpdgraph              1.0+8.14
│ ⊘ remove coq-equations             1.3+8.14
│ ⊘ remove coq-ext-lib               0.11.4
│ ⊘ remove coq-flocq                 3.4.2
│ ⊘ remove coq-gappa                 1.5.0
│ ⊘ remove coq-hammer                1.3.2+8.14
│ ⊘ remove coq-hammer-tactics        1.3.2+8.14
│ ⊘ remove coq-hott                  8.14
│ ⊘ remove coq-interval              4.3.0
│ ⊘ remove coq-iris                  3.5.0
│ ⊘ remove coq-iris-heap-lang        3.5.0
│ ⊘ remove coq-libhyps               2.0.4
│ ⊘ remove coq-math-classes          8.13.0
│ ⊘ remove coq-mathcomp-character    1.13.0
│ ⊘ remove coq-mathcomp-multinomials 1.5.4
│ ⊘ remove coq-mathcomp-real-closed  1.1.2
│ ⊘ remove coq-mathcomp-zify         1.1.0+1.12+8.13
│ ⊘ remove coq-menhirlib             20211012
│ ⊘ remove coq-mtac2                 1.4+8.14
│ ⊘ remove coq-paramcoq              1.1.3+coq8.14
│ ⊘ remove coq-quickchick            1.6.0
│ ⊘ remove coq-reglang               1.1.2
│ ⊘ remove coq-simple-io             1.6.0
│ ⊘ remove coq-stdpp                 1.6.0
│ ⊘ remove coq-unicoq                1.6+8.14
│ ⊘ remove coq-unimath               20210807
│ ⊘ remove coq-vst                   2.8
└─ 

The former state can be restored with:
    /opt/homebrew/bin/opam switch import "/Users/brandomiranda/.opam/__coq-platform.2022.01.0~8.14~2022.01/.opam-switch/backup/state-20220303231142.export"
Or you can retry to install your package selection with:
    /opt/homebrew/bin/opam install --restore

then my coq in my vscode stills fails

Cannot find a physical path bound to logical path matching suffix
StructTact.
Not in proof mode.

why?

Make find_reverse_rewrite consistent

Same issue as with find_rewrite. Should be made more consistent. This was also the place where people said Tactic Notations would be good. I don't know what that means though.

Add Eric's in to out break_match

Ltac break_match_sm' t :=
 match t with
   | context[match ?X with ​_ => _​ end] =>
     break_match_sm' X || destruct X eqn:?
   | _ => destruct t eqn:?
 end.

Ltac break_match_sm :=
 match goal with
   (* | [ H : context[match ?X with ​_ => _​ end] |- _ ] => *)
   (*   break_match_sm' X *)
   | [ |- context[match ?X with ​_ => _​ end] ] =>
     break_match_sm' X
 end.

Ideally there would be a hypothesis and goal version of each of this. There should be a well thought out name for it as well instead of just sm suffix.

Make `break_exists` preserve names

This is a trick I stole from a Coq-club post.

Ltac break_exists :=
  repeat match goal with
  | [ H: exists (varname: _), _ |- _ ] =>
    let name := fresh varname in
    destruct H as [name ?]
  end.

The problem is that it will probably break a lot of downstream proofs that rely on the name "x" being used instead.

Use tactic notations

I dont know what this means, but it was suggested and everybody nodded, so I assume its good.

commit for coq 8.10

having coq 8.10 and doing normal isntall works. It will use dev. e.g.

# - Create the 8.10.2 switch
opam switch create coq-8.10 4.07.1
eval $(opam env --switch=coq-8.10 --set-switch)
opam pin add -y coq 8.10.2
# - Install dependency packages for 8.10
opam repo add coq-extra-dev https://coq.inria.fr/opam/extra-dev
# We don't need it in all opam switches due to incompatabilities: Run `opam repository add <coq-proj> --all-switches|--set-default' to use it in all existing switches, or in newly created switches, respectively. cmd: opam repository add coq-extra-dev --all-switches
opam repo add coq-released https://coq.inria.fr/opam/released
opam repo add psl-opam-repository https://github.com/uds-psl/psl-opam-repository.git
...
opam install -y coq-struct-tact

this also works with commit :

opam pin add -y coq-struct-tact git+https://github.com/uwplse/StructTact.git#b95f041cb83986fb0fe1f9689d7196e2f09a4839

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.