{"id":14966268,"url":"https://github.com/verse-lab/ceramist","last_synced_at":"2026-02-22T22:17:57.448Z","repository":{"id":112327274,"uuid":"189386550","full_name":"verse-lab/ceramist","owner":"verse-lab","description":"Verified hash-based AMQ structures in Coq","archived":false,"fork":false,"pushed_at":"2020-04-13T06:57:28.000Z","size":1086,"stargazers_count":124,"open_issues_count":0,"forks_count":5,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-08-14T08:59:19.611Z","etag":null,"topics":["amq","bloom-filter","coq","coq-formalization","counting-bloom-filter","probability","quotient-filter"],"latest_commit_sha":null,"homepage":"","language":"Coq","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/verse-lab.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-05-30T09:37:20.000Z","updated_at":"2025-07-14T10:29:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"818ccb63-c25c-4b2f-a3af-8f8fb1a58658","html_url":"https://github.com/verse-lab/ceramist","commit_stats":null,"previous_names":["certichain/ceramist"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/verse-lab/ceramist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-lab%2Fceramist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-lab%2Fceramist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-lab%2Fceramist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-lab%2Fceramist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/verse-lab","download_url":"https://codeload.github.com/verse-lab/ceramist/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verse-lab%2Fceramist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273838362,"owners_count":25177162,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["amq","bloom-filter","coq","coq-formalization","counting-bloom-filter","probability","quotient-filter"],"created_at":"2024-09-24T13:36:07.762Z","updated_at":"2026-02-22T22:17:57.349Z","avatar_url":"https://github.com/verse-lab.png","language":"Coq","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Ceramist -  Verified Hash-based Approximate Membership Structures\n\n[![Build Status](https://travis-ci.org/certichain/ceramist.svg?branch=master)](https://travis-ci.org/certichain/ceramist)\n[![License](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://raw.githubusercontent.com/certichain/ceramist/master/LICENSE)\n[![DOI](https://zenodo.org/badge/189386550.svg)](https://zenodo.org/badge/latestdoi/189386550)\n\n\n## Installation (using Opam)\nCreate a new switch\n```\nopam switch create ceramist 4.09.0\neval $(opam env)\n```\n\nAdd coq-released repository to opam:\n```\nopam repo add coq-released https://coq.inria.fr/opam/released\n```\n\nInstall ceramist:\n```\nopam install coq-ceramist.1.0.1\n```\n\n\n## Installation (from Sources)\nUse opam to install dependencies\n\n```\nopam install ./opam\n```\n\nThen build the project:\n```\nmake clean \u0026\u0026 make\n```\nTakes around an hour to build.\n\n## Project Structure\nThe structure of the overall development is as follows:\n```\n.\n├── Computation\n│   ├── Comp.v\n│   └── Notationv1.v\n├── Structures\n│   ├── BlockedAMQ\n│   │   └── BlockedAMQ.v\n│   ├── BloomFilter\n│   │   ├── BloomFilter_Definitions.v\n│   │   └── BloomFilter_Probability.v\n│   ├── Core\n│   │   ├── AMQHash.v\n│   │   ├── AMQReduction.v\n│   │   ├── AMQ.v\n│   │   ├── FixedList.v\n│   │   ├── FixedMap.v\n│   │   ├── Hash.v\n│   │   └── HashVec.v\n│   ├── CountingBloomFilter\n│   │   ├── CountingBloomFilter_Definitions.v\n│   │   └── CountingBloomFilter_Probability.v\n│   └── QuotientFilter\n│       ├── QuotientFilter_Definitions.v\n│       └── QuotientFilter_Probability.v\n└── Utils\n    ├── InvMisc.v\n    ├── rsum_ext.v\n    ├── seq_ext.v\n    ├── seq_subset.v\n    ├── stirling.v\n    └── tactics.v\n\n8 directories, 22 files\n```\n\nThe library is split into separate logical components by directory:\n- *Computation* - defines a probability monad and associated notation for it on top of the 'coq-infotheo' probability library.\n- *Utils* - collection of utility lemmas and tactics used throughout the development\n- *Structures/Core* - contains definitions and properties about the core probabilistic primitives exported by the library, and defines the abstract AMQ interface satisfied by all instantiations.\n- *Structures/BloomFilter* - example use of the exported library to prove various probabilistic properties on bloom filters.\n- *Structures/CountingBloomFilter* - another exemplar use of the library to prove probabilistic properties on counting bloom filters. \n- *Structures/QuotientBloomFilter* - exemplar use of library to prove probabilistic properties of quotient filters\n- *Structures/BlockedAMQ* - exemplar use of library to prove probabilistic properties of a higher order AMQ - the blockedAMQ \n\nCheck out `Structures/Demo.v` for an example instantiation of the BlockedAMQ to derive Blocked Bloom filters, Counting Blocked bloom filters and Blocked Quotient filters.\n\n## Tactics\nTo simplify reasoning about probabilistic computations, we provide a few helper tactics under `ProbHash.Utils`:\n\n- `comp_normalize` - is a tactic which normalizes  probabilistic computations in the goal to a standard\n   form consisting of a nested summation with a summand which is the product of each individual statement:\n   For example, if our goal contains a term of the form:\n   ```\n   d[ res \u003c-$ hash n v hsh;\n   x \u003c- fst res;\n   ret x ] value\n   ```\n   applying `comp_normalize` normalizes it to:\n   ```\n   \\sum_(i in HashState n) \n   \\sum_(i0 in 'I_Hash_size.+1) \n   ((d[ hash n v hsh]) (i, i0) *R* \n   ((value == i0) %R))\n   ``` \n   This tactic works by simply recursively descending the computation and expanding the\n   definition of the distribution.\n\n- `comp_simplify` - is a tactic which effectively applies beta\n   reduction to the normalized form, substituting any `ret x` (which\n   have been normalized to a factor of the form `(x == ...)` by the previous tactic)\n   statements into the rest of the computation - applying it to the previous example would result in:\n   ```\n   \\sum_(i in HashState n) \n   (d[ hash n v hsh]) (i, value)\n   ```\n- `comp_simplify_n n` - is a variant of the previous one which applies\n   the reduction a fixed number `n` of times as sometimes the previous\n   tactic may loop.\n- `comp_possible_decompose` - is a tactic which converts a fact (must\n   be first element of goal) about a possible computation \n   `( d[ c1; c2; ....; cn] v != 0)` \n   into a fact about the possibility of the individual statements of\n   the computation\n   `forall v1,v2, ..., vn, d[ c1 ] v1 != 0 -\u003e d[ c2] v2 -\u003e .... d[ cn] vn != 0`\n- `comp_possible_exists` is a tactic which converts a goal about a computation being possible\n   `( d[ c1; c2; ....; cn] v != 0)` \n   into a corresponding proof of existance, where one must provide\n   possible outcomes for each statement outcome\n   `exists v1,v2, ..., vn, d[ c1 ] v1 != 0 /\\ d[ c2] v2 /\\ .... /\\ d[ cn] vn != 0`\n- `comp_impossible_decompose` - is a tactic which automatically\n   decomposes an impossibility statement \n   `\\sum_{v1} ... \\sum_{vn} P[c1 = v1] * ... * P[ cn = vn ] = 0` \n   into properties about its component parts \n   `forall v1,..,vn, P[c1 = v1] * ... * P[cn = vn] = 0`\n\n- `exchange_big_inwards f` - is a tactic which moves the outermost\n   summation in a series of nested summations to the innermost\n   position, then applies the supplied tactic `f` in this context.\n\n- `exchange_big_outwards n` - is a tactic which moves the `n`th\n   summation in a series of nested summations to the outermost\n   position.\n\n## License\nGiven its dependencies:\n\n- Coq (distributed under the LGPLv2.1 license)\n- MathComp (distributed under the CeCILL-B license)\n- Infotheo (distributed under the GPLv3 license)\n\nProbHash is distributed under the GPLv3 license.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverse-lab%2Fceramist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fverse-lab%2Fceramist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverse-lab%2Fceramist/lists"}