This document discusses Scarab, a SAT-based constraint programming system developed in Scala. Scarab provides a domain-specific language and APIs for modeling constraint satisfaction problems and solving them using SAT encodings and SAT solvers like Sat4j. It aims to provide an expressive, efficient and customizable workbench for developing SAT-based systems. The document gives examples of using Scarab to model and solve the graph coloring problem and pandiagonal Latin square problem. It also discusses Scarab's features like efficiency, portability and ability to leverage advanced SAT solving techniques.
Weaving Dataflows with Silk - ScalaMatsuri 2014, TokyoTaro L. Saito
Silk is a framework for building dataflows in Scala. In Silk users write data processing code with collection operators (e.g., map, filter, reduce, join, etc.). Silk uses Scala Macros to construct a DAG of dataflows, nodes of which are annotated with variable names in the program. By using these variable names as markers in the DAG, Silk can support interruption and resume of dataflows and querying the intermediate data. By separating dataflow descriptions from its computation, Silk enables us to switch executors, called weavers, for in-memory or cluster computing without modifying the code. In this talk, we will show how Silk helps you run data-processing pipelines as you write the code.
Weaving Dataflows with Silk - ScalaMatsuri 2014, TokyoTaro L. Saito
Silk is a framework for building dataflows in Scala. In Silk users write data processing code with collection operators (e.g., map, filter, reduce, join, etc.). Silk uses Scala Macros to construct a DAG of dataflows, nodes of which are annotated with variable names in the program. By using these variable names as markers in the DAG, Silk can support interruption and resume of dataflows and querying the intermediate data. By separating dataflow descriptions from its computation, Silk enables us to switch executors, called weavers, for in-memory or cluster computing without modifying the code. In this talk, we will show how Silk helps you run data-processing pipelines as you write the code.
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
While the Java platform has gained notoriety in the last 15 years as a robust application platform with a thriving ecosystem and well-established practices, the Java language has had its share of criticism. Highly verbose, overly didactic, limited feature set; whichever flavor of criticism you prefer, it's patently obvious that Java is playing catch up to more modern languages with a less rigid evolution path.
The language landscape today is vastly different than it had been five or ten years ago; a wide array of languages are available, designed to suit a variety of flavors: Groovy, Clojure, Scala, Gosu, Kotlin... which should you choose? This lecture focuses on one company's decision to focus on Scala, and presents a case study based on our experiences using Scala in practice, in the hope of providing much-needed real world context to assist your decision.
This presentation was used for the Scala In Practice lecture at the Botzia Israeli Java User Group meeting, May 3rd 2012.
Scala Refactoring for Fun and Profit (Japanese subtitles)Tomer Gabel
A talk given at Scala Matsuri 2016 in Tokyo, Japan.
New Scala practitioners often experience the uncomfortable feeling of "not quite getting it." If you've studied the syntax and written tests, maybe production code; if you're becoming comfortable with the language and libraries, but keep worrying that there's "a better way", or that your code isn't "idiomatic enough" - this session is for you.
By refactoring a real, live codebase, this talk will provide you with new tools and increased confidence. Between the provided examples and the ensuing discussion, you will walk away with a better feel for Scala and how to employ it in the real world.
Finally Java SE 7 is GA and you can start using it. This talk will cover the most important new features of the language and the virtual machine. It will also cover some features that did not make it in to the SE 7 release. Finally we will discuss current state of Java as an ecosystem and my analysis and hopes for the future.
Apache Spark: The Analytics Operating SystemAdarsh Pannu
This presentation was delivered by Adarsh Pannu at IBM's Insight Conference in Nov 2015. For a recording, visit: https://www.youtube.com/watch?v=Tbm7HIlmwJQ
The presentation provides an overview of Apache Spark, a general-purpose big data processing engine built around speed, ease of use and sophisticated analytics. It enumerates the benefits of incorporating Spark in the enterprise, including how it allows developers to write fully-featured distributed applications ranging from traditional data processing pipelines to complex machine learning. The presentation uses the Airline "On Time" data set to explore various components of the Spark stack.
The State of Managed Runtimes 2013, by Attila SzegediZeroTurnaround
There’s JVM, and that’s it, right? Well, not exactly. Even within JVM, there’s an increasing support for running all kinds of non-Java languages: we have invokedynamic, but it’s being improved, and new layers of functionality are emerging on top of it, making JVM a better home for all kinds of programming languages. There’s life outside of JVM too. JavaScript seems to be a new assembler-lever compilation target even for C programs (I’ll show some amusing examples of what exactly you can run these days in a browser) , and there are some independent efforts at managed runtimes in various stages of completion that seem promising – PyPy, Topaz, Rubinius, Parrot VM (it’s alive again!). This talk is admittedly a language-runtime-enthusiast’s walk-through the things he finds interesting happening this year. Recorded at GeekOut 2013.
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)jaxLondonConference
Presented at JAX London 2013
Worried about the future of Java? Want to see it keep moving forward? Don't be concerned. The transformation of Java is already underway. Driven by new technologies and new opportunities Java and the JVM are entering uncharted worlds and challenging old approaches. In this session learn about one such expedition in the form of an introductory talk to technology being developed by IBM. This experimental technology is exploring a new way to share data between the JVM and other runtimes.
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLabCloudxLab
Big Data with Hadoop & Spark Training: http://bit.ly/2IXKBvs
This CloudxLab Introduction to Scala tutorial helps you to understand Scala in detail. Below are the topics covered in this tutorial:
1) Scala - Scalable Language
2) Why Scala?
3) Scala - History
4) Scala - Hello World - Example
5) Scala - Hello World - Compiling and Running
6) Variables in Scala
7) Immutable variables
8) Type inference in Scala
9) Classes in Scala
10) Singleton Objects in Scala
11) Scala - If - else
12) Loops in Scala - while, do - while and for loops
13) Different ways of representing functions in Scala
14) Scala Collections
15) Sequences - Array & List
16) Scala Collections - Sets, Tuples and Maps
17) Higher Order Functions in Scala - map, flatMap, filter, foreach and reduce
18) Interaction with Java
19) SBT - Build Tool in Scala
20) SBT Demo
21) Case Classes in Scala
A presentation at Twitter's official developer conference, Chirp, about why we use the Scala programming language and how we build services in it. Provides a tour of a number of libraries and tools, both developed at Twitter and otherwise.
While the Java platform has gained notoriety in the last 15 years as a robust application platform with a thriving ecosystem and well-established practices, the Java language has had its share of criticism. Highly verbose, overly didactic, limited feature set; whichever flavor of criticism you prefer, it's patently obvious that Java is playing catch up to more modern languages with a less rigid evolution path.
The language landscape today is vastly different than it had been five or ten years ago; a wide array of languages are available, designed to suit a variety of flavors: Groovy, Clojure, Scala, Gosu, Kotlin... which should you choose? This lecture focuses on one company's decision to focus on Scala, and presents a case study based on our experiences using Scala in practice, in the hope of providing much-needed real world context to assist your decision.
This presentation was used for the Scala In Practice lecture at the Botzia Israeli Java User Group meeting, May 3rd 2012.
Scala Refactoring for Fun and Profit (Japanese subtitles)Tomer Gabel
A talk given at Scala Matsuri 2016 in Tokyo, Japan.
New Scala practitioners often experience the uncomfortable feeling of "not quite getting it." If you've studied the syntax and written tests, maybe production code; if you're becoming comfortable with the language and libraries, but keep worrying that there's "a better way", or that your code isn't "idiomatic enough" - this session is for you.
By refactoring a real, live codebase, this talk will provide you with new tools and increased confidence. Between the provided examples and the ensuing discussion, you will walk away with a better feel for Scala and how to employ it in the real world.
Finally Java SE 7 is GA and you can start using it. This talk will cover the most important new features of the language and the virtual machine. It will also cover some features that did not make it in to the SE 7 release. Finally we will discuss current state of Java as an ecosystem and my analysis and hopes for the future.
Apache Spark: The Analytics Operating SystemAdarsh Pannu
This presentation was delivered by Adarsh Pannu at IBM's Insight Conference in Nov 2015. For a recording, visit: https://www.youtube.com/watch?v=Tbm7HIlmwJQ
The presentation provides an overview of Apache Spark, a general-purpose big data processing engine built around speed, ease of use and sophisticated analytics. It enumerates the benefits of incorporating Spark in the enterprise, including how it allows developers to write fully-featured distributed applications ranging from traditional data processing pipelines to complex machine learning. The presentation uses the Airline "On Time" data set to explore various components of the Spark stack.
The State of Managed Runtimes 2013, by Attila SzegediZeroTurnaround
There’s JVM, and that’s it, right? Well, not exactly. Even within JVM, there’s an increasing support for running all kinds of non-Java languages: we have invokedynamic, but it’s being improved, and new layers of functionality are emerging on top of it, making JVM a better home for all kinds of programming languages. There’s life outside of JVM too. JavaScript seems to be a new assembler-lever compilation target even for C programs (I’ll show some amusing examples of what exactly you can run these days in a browser) , and there are some independent efforts at managed runtimes in various stages of completion that seem promising – PyPy, Topaz, Rubinius, Parrot VM (it’s alive again!). This talk is admittedly a language-runtime-enthusiast’s walk-through the things he finds interesting happening this year. Recorded at GeekOut 2013.
Packed Objects: Fast Talking Java Meets Native Code - Steve Poole (IBM)jaxLondonConference
Presented at JAX London 2013
Worried about the future of Java? Want to see it keep moving forward? Don't be concerned. The transformation of Java is already underway. Driven by new technologies and new opportunities Java and the JVM are entering uncharted worlds and challenging old approaches. In this session learn about one such expedition in the form of an introductory talk to technology being developed by IBM. This experimental technology is exploring a new way to share data between the JVM and other runtimes.
Introduction to Scala | Big Data Hadoop Spark Tutorial | CloudxLabCloudxLab
Big Data with Hadoop & Spark Training: http://bit.ly/2IXKBvs
This CloudxLab Introduction to Scala tutorial helps you to understand Scala in detail. Below are the topics covered in this tutorial:
1) Scala - Scalable Language
2) Why Scala?
3) Scala - History
4) Scala - Hello World - Example
5) Scala - Hello World - Compiling and Running
6) Variables in Scala
7) Immutable variables
8) Type inference in Scala
9) Classes in Scala
10) Singleton Objects in Scala
11) Scala - If - else
12) Loops in Scala - while, do - while and for loops
13) Different ways of representing functions in Scala
14) Scala Collections
15) Sequences - Array & List
16) Scala Collections - Sets, Tuples and Maps
17) Higher Order Functions in Scala - map, flatMap, filter, foreach and reduce
18) Interaction with Java
19) SBT - Build Tool in Scala
20) SBT Demo
21) Case Classes in Scala
Node.js vs Play Framework (with Japanese subtitles)Yevgeniy Brikman
Video: http://www.nicovideo.jp/watch/1410857293
Here's the showdown you've been waiting for: Node.js vs Play Framework. Both are popular open source web frameworks that are built for developer productivity, asynchronous I/O, and the real time web. But which one is easier to learn, test, deploy, debug, and scale? Should you pick Javascript or Scala? The Google v8 engine or the JVM? NPM or Ivy? Grunt or SBT? Two frameworks enter, one framework leaves.
This version of the presentation has Japanese subtitles. For the English only version, see http://www.slideshare.net/brikis98/nodejs-vs-play-framework
Scala - The Simple Parts, SFScala presentationMartin Odersky
These are the slides of the talk I gave on May 22, 2014 to the San Francisco Scala user group. Similar talks were given before at GOTO Chicago, keynote, at Gilt Groupe and Hunter College in New York, at JAX Mainz and at FlatMap Oslo.
SCA To Date and Motivation for Change. These slides will discuss why the JTRS Program Executive Office (JPEO) is aggressively procuring Software Defined Radio (SDR) consortium and industry assistance to spearhead a high impact evolution of the Software Communications Architecture (SCA) intended to deliver better radio performance along with a smaller footprint for waveforms and radio software. The webcast audience will learn about innovative SCA change proposal details and identified opportunities for near term radio performance impact with rapid market availability of these new capabilities via highly motivated COTS SDR software and development tool vendors.
OpenPOWER Webinar from University of Delaware - Title :OpenMP (offloading) o...Ganesan Narayanasamy
This presentation discusses the on-going project on building a validation and verification (V&V) testsuite of the widely popular directive-based parallel programming model, OpenMP. The talk will present results of the OpenMP offloading features implemented in various compilers targeting Summit among other systems. This project is open-source and the SOLLVE V&V team welcomes collaborations.
Apache Hivemall is a scalable machine learning library for Apache Hive, Apache Spark, and Apache Pig.
Hivemall provides a number of machine learning functionalities across classification, regression, ensemble learning, and feature engineering through UDFs/UDAFs/UDTFs of Hive.
We have released the first Apache release (v0.5.0-incubating) on Mar 5, 2018 and the project plans to release v0.5.2 in Q2, 2018.
We will first give a quick walk-through of features, usages, what's new in v0.5.0, and future roadmaps of Apache Hivemall. Next, we will introduce Hivemall on Apache Spark in depth such as DataFrame integration and Spark 2.3 supports in Hivemall.
External Aerodynamic Optimization Using ANSYS Mesh MorphingMarco E. Biancolini
Aero development requires the exploration of many shape variations, so a highly reliable and fully automated workflow using HPC is needed. This presentation will show how mesh morphing can be used to make the ANSYS CFD model parametric, and how the DesignXplorer optimizer cann be used to automate the calculation.
This talk was given at GTC16 by James Beyer and Jeff Larkin, both members of the OpenACC and OpenMP committees. It's intended to be an unbiased discussion of the differences between the two languages and the tradeoffs to each approach.
(Costless) Software Abstractions for Parallel ArchitecturesJoel Falcou
Performing large, intensive or non-trivial computing on array like data structures is one of the most common task in scientific computing, video game development and other fields. This matter of fact is backed up by the large number of tools, languages and libraries to perform such tasks. If we restrict ourselves to C++ based solutions, more than a dozen such libraries exists from BLAS/LAPACK C++ binding to template meta-programming based Blitz++ or Eigen. If all of these libraries provide good performance or good abstraction, none of them seems to fit the need of so many different user types.
Moreover, as parallel system complexity grows, the need to maintain all those components quickly become unwieldy. This talk explores various software design techniques - like Generative Programming, MetaProgramming and Generic Programming - and their application to the implementation of a parallel computing librariy in such a way that:
- abstraction and expressiveness are maximized - cost over efficiency is minimized
We'll skim over various applications and see how they can benefit from such tools. We will conclude by discussing what lessons were learnt from this kind of implementation and how those lessons can translate into new directions for the language itself.
Abstractions and Directives for Adapting Wavefront Algorithms to Future Archi...inside-BigData.com
In this deck from PASC18, Robert Searles from the University of Delaware presents: Abstractions and Directives for Adapting Wavefront Algorithms to Future Architectures.
"Architectures are rapidly evolving, and exascale machines are expected to offer billion-way concurrency. We need to rethink algorithms, languages and programming models among other components in order to migrate large scale applications and explore parallelism on these machines. Although directive-based programming models allow programmers to worry less about programming and more about science, expressing complex parallel patterns in these models can be a daunting task especially when the goal is to match the performance that the hardware platforms can offer. One such pattern is wavefront. This paper extensively studies a wavefront-based miniapplication for Denovo, a production code for nuclear reactor modeling.
We parallelize the Koch-Baker-Alcouffe (KBA) parallel-wavefront sweep algorithm in the main kernel of Minisweep (the miniapplication) using CUDA, OpenMP and OpenACC. Our OpenACC implementation running on NVIDIA's next-generation Volta GPU boasts an 85.06x speedup over serial code, which is larger than CUDA's 83.72x speedup over the same serial implementation. Our experimental platform includes SummitDev, an ORNL representative architecture of the upcoming Summit supercomputer. Our parallelization effort across platforms also motivated us to define an abstract parallelism model that is architecture independent, with a goal of creating software abstractions that can be used by applications employing the wavefront sweep motif."
Watch the video: https://wp.me/p3RLHQ-iPU
Read the Full Paper: https://doi.org/10.1145/3218176.3218228
and
https://pasc18.pasc-conference.org/
Sign up for our insideHPC Newsletter: http://insidehpc.com/newsletter
Top Features to Include in Your Winzo Clone App for Business Growth (4).pptxrickgrimesss22
Discover the essential features to incorporate in your Winzo clone app to boost business growth, enhance user engagement, and drive revenue. Learn how to create a compelling gaming experience that stands out in the competitive market.
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I ...Juraj Vysvader
In 2015, I used to write extensions for Joomla, WordPress, phpBB3, etc and I didn't get rich from it but it did have 63K downloads (powered possible tens of thousands of websites).
Cyaniclab : Software Development Agency Portfolio.pdfCyanic lab
CyanicLab, an offshore custom software development company based in Sweden,India, Finland, is your go-to partner for startup development and innovative web design solutions. Our expert team specializes in crafting cutting-edge software tailored to meet the unique needs of startups and established enterprises alike. From conceptualization to execution, we offer comprehensive services including web and mobile app development, UI/UX design, and ongoing software maintenance. Ready to elevate your business? Contact CyanicLab today and let us propel your vision to success with our top-notch IT solutions.
Listen to the keynote address and hear about the latest developments from Rachana Ananthakrishnan and Ian Foster who review the updates to the Globus Platform and Service, and the relevance of Globus to the scientific community as an automation platform to accelerate scientific discovery.
AI Pilot Review: The World’s First Virtual Assistant Marketing SuiteGoogle
AI Pilot Review: The World’s First Virtual Assistant Marketing Suite
👉👉 Click Here To Get More Info 👇👇
https://sumonreview.com/ai-pilot-review/
AI Pilot Review: Key Features
✅Deploy AI expert bots in Any Niche With Just A Click
✅With one keyword, generate complete funnels, websites, landing pages, and more.
✅More than 85 AI features are included in the AI pilot.
✅No setup or configuration; use your voice (like Siri) to do whatever you want.
✅You Can Use AI Pilot To Create your version of AI Pilot And Charge People For It…
✅ZERO Manual Work With AI Pilot. Never write, Design, Or Code Again.
✅ZERO Limits On Features Or Usages
✅Use Our AI-powered Traffic To Get Hundreds Of Customers
✅No Complicated Setup: Get Up And Running In 2 Minutes
✅99.99% Up-Time Guaranteed
✅30 Days Money-Back Guarantee
✅ZERO Upfront Cost
See My Other Reviews Article:
(1) TubeTrivia AI Review: https://sumonreview.com/tubetrivia-ai-review
(2) SocioWave Review: https://sumonreview.com/sociowave-review
(3) AI Partner & Profit Review: https://sumonreview.com/ai-partner-profit-review
(4) AI Ebook Suite Review: https://sumonreview.com/ai-ebook-suite-review
Enterprise Resource Planning System includes various modules that reduce any business's workload. Additionally, it organizes the workflows, which drives towards enhancing productivity. Here are a detailed explanation of the ERP modules. Going through the points will help you understand how the software is changing the work dynamics.
To know more details here: https://blogs.nyggs.com/nyggs/enterprise-resource-planning-erp-system-modules/
Globus Compute wth IRI Workflows - GlobusWorld 2024Globus
As part of the DOE Integrated Research Infrastructure (IRI) program, NERSC at Lawrence Berkeley National Lab and ALCF at Argonne National Lab are working closely with General Atomics on accelerating the computing requirements of the DIII-D experiment. As part of the work the team is investigating ways to speedup the time to solution for many different parts of the DIII-D workflow including how they run jobs on HPC systems. One of these routes is looking at Globus Compute as a way to replace the current method for managing tasks and we describe a brief proof of concept showing how Globus Compute could help to schedule jobs and be a tool to connect compute at different facilities.
First Steps with Globus Compute Multi-User EndpointsGlobus
In this presentation we will share our experiences around getting started with the Globus Compute multi-user endpoint. Working with the Pharmacology group at the University of Auckland, we have previously written an application using Globus Compute that can offload computationally expensive steps in the researcher's workflows, which they wish to manage from their familiar Windows environments, onto the NeSI (New Zealand eScience Infrastructure) cluster. Some of the challenges we have encountered were that each researcher had to set up and manage their own single-user globus compute endpoint and that the workloads had varying resource requirements (CPUs, memory and wall time) between different runs. We hope that the multi-user endpoint will help to address these challenges and share an update on our progress here.
Custom Healthcare Software for Managing Chronic Conditions and Remote Patient...Mind IT Systems
Healthcare providers often struggle with the complexities of chronic conditions and remote patient monitoring, as each patient requires personalized care and ongoing monitoring. Off-the-shelf solutions may not meet these diverse needs, leading to inefficiencies and gaps in care. It’s here, custom healthcare software offers a tailored solution, ensuring improved care and effectiveness.
Understanding Globus Data Transfers with NetSageGlobus
NetSage is an open privacy-aware network measurement, analysis, and visualization service designed to help end-users visualize and reason about large data transfers. NetSage traditionally has used a combination of passive measurements, including SNMP and flow data, as well as active measurements, mainly perfSONAR, to provide longitudinal network performance data visualization. It has been deployed by dozens of networks world wide, and is supported domestically by the Engagement and Performance Operations Center (EPOC), NSF #2328479. We have recently expanded the NetSage data sources to include logs for Globus data transfers, following the same privacy-preserving approach as for Flow data. Using the logs for the Texas Advanced Computing Center (TACC) as an example, this talk will walk through several different example use cases that NetSage can answer, including: Who is using Globus to share data with my institution, and what kind of performance are they able to achieve? How many transfers has Globus supported for us? Which sites are we sharing the most data with, and how is that changing over time? How is my site using Globus to move data internally, and what kind of performance do we see for those transfers? What percentage of data transfers at my institution used Globus, and how did the overall data transfer performance compare to the Globus users?
Paketo Buildpacks : la meilleure façon de construire des images OCI? DevopsDa...Anthony Dahanne
Les Buildpacks existent depuis plus de 10 ans ! D’abord, ils étaient utilisés pour détecter et construire une application avant de la déployer sur certains PaaS. Ensuite, nous avons pu créer des images Docker (OCI) avec leur dernière génération, les Cloud Native Buildpacks (CNCF en incubation). Sont-ils une bonne alternative au Dockerfile ? Que sont les buildpacks Paketo ? Quelles communautés les soutiennent et comment ?
Venez le découvrir lors de cette session ignite
Check out the webinar slides to learn more about how XfilesPro transforms Salesforce document management by leveraging its world-class applications. For more details, please connect with sales@xfilespro.com
If you want to watch the on-demand webinar, please click here: https://www.xfilespro.com/webinars/salesforce-document-management-2-0-smarter-faster-better/
Exploring Innovations in Data Repository Solutions - Insights from the U.S. G...Globus
The U.S. Geological Survey (USGS) has made substantial investments in meeting evolving scientific, technical, and policy driven demands on storing, managing, and delivering data. As these demands continue to grow in complexity and scale, the USGS must continue to explore innovative solutions to improve its management, curation, sharing, delivering, and preservation approaches for large-scale research data. Supporting these needs, the USGS has partnered with the University of Chicago-Globus to research and develop advanced repository components and workflows leveraging its current investment in Globus. The primary outcome of this partnership includes the development of a prototype enterprise repository, driven by USGS Data Release requirements, through exploration and implementation of the entire suite of the Globus platform offerings, including Globus Flow, Globus Auth, Globus Transfer, and Globus Search. This presentation will provide insights into this research partnership, introduce the unique requirements and challenges being addressed and provide relevant project progress.
TROUBLESHOOTING 9 TYPES OF OUTOFMEMORYERRORTier1 app
Even though at surface level ‘java.lang.OutOfMemoryError’ appears as one single error; underlyingly there are 9 types of OutOfMemoryError. Each type of OutOfMemoryError has different causes, diagnosis approaches and solutions. This session equips you with the knowledge, tools, and techniques needed to troubleshoot and conquer OutOfMemoryError in all its forms, ensuring smoother, more efficient Java applications.
OpenFOAM solver for Helmholtz equation, helmholtzFoam / helmholtzBubbleFoamtakuyayamamoto1800
In this slide, we show the simulation example and the way to compile this solver.
In this solver, the Helmholtz equation can be solved by helmholtzFoam. Also, the Helmholtz equation with uniformly dispersed bubbles can be simulated by helmholtzBubbleFoam.
Developing Distributed High-performance Computing Capabilities of an Open Sci...Globus
COVID-19 had an unprecedented impact on scientific collaboration. The pandemic and its broad response from the scientific community has forged new relationships among public health practitioners, mathematical modelers, and scientific computing specialists, while revealing critical gaps in exploiting advanced computing systems to support urgent decision making. Informed by our team’s work in applying high-performance computing in support of public health decision makers during the COVID-19 pandemic, we present how Globus technologies are enabling the development of an open science platform for robust epidemic analysis, with the goal of collaborative, secure, distributed, on-demand, and fast time-to-solution analyses to support public health.
Developing Distributed High-performance Computing Capabilities of an Open Sci...
Scarab: SAT-based Constraint Programming System in Scala / Scala上で実現された制約プログラミングシステムScarabについて
1. Scarab
SAT-based Constraint Programming System in Scala
Takehide Soh1
worked in cooperation with
Daniel Le Berre2 Stephanie Roussel2
Mutsunori Banbara1 Naoyuki Tamura1
1Information Science and Technology Center, Kobe University
2CRIL-CNRS, UMR 8188, Universite d'Artois
2014/09/05
ScalaMatsuri
1 / 60
2. Contents of Talk
1 What is SAT?
2 Scarab: SAT-based CP System in Scala
3 Designing Constraint Models in Scarab
4 Advanced Solving Techniques using Sat4j
2 / 60
6. rst NP-complete problem [Cook, 1971] and is the most
fundamental problem in Computer Science both theoretically and
practically.
SAT instances are given in the Conjunctive Normal Form (CNF).
A CNF formula is a conjunction of clauses.
A clause is a disjunction of literals.
A literal is either a Boolean variable or its negation.
3 / 60
10. rst NP-complete problem [Cook, 1971] and is the most
fundamental problem in Computer Science both theoretically and
practically.
Example of an SAT instance (in CNF)
Let a; b; c 2 fTrue; Falseg be Boolean variables.
Question: the following CNF formula is satis
11. able or not?
(a _ b _ c) ^
(:a _ :b) ^
(:a _ :c) ^
(:b _ :c)
Answer: Yes.
There is an assignment (a; b; c) = (True; False; False) satisfying all clauses.
4 / 60
12. SAT Solvers
There are 2n combinations for assignments.
We cannot solve any SAT instances even for small n (e.g. n = 100)?
Much eort on SAT solvers practically has been pushing up their
limitation!
SAT solver is a program of deciding whether a given SAT instance is
satis
15. able assignment when the
instance is SAT.
Complete SAT solvers originated in DPLL [Davis et al., 1962].
In particular, since around 2000, their performance is improved every
year with techniques of Con
ict Driven Clause Learning (CDCL),
Non-chronological Backtracking, Rapid Restarts, and Variable
Selection Heuristics.
Modern SAT solvers can handle instances with more than 106
variables and 107 clauses.
5 / 60
16. Progress of SAT Solvers (shown by [Simon 2011])
1200
1000
800
Results of the SAT competition/race winners on the SAT 2009 application benchmarks, 20mn timeout
Limmat (2002)
Zchaff (2002)
Berkmin (2002)
Forklift (2003)
Siege (2003)
Zchaff (2004)
SatELite (2005)
Minisat 2 (2006)
Picosat (2007)
Rsat (2007)
Minisat 2.1 (2008)
Precosat (2009)
Glucose (2009)
Clasp (2009)
Cryptominisat (2010)
Lingeling (2010)
Minisat 2.2 (2010)
Glucose 2 (2011)
Glueminisat (2011)
Contrasat (2011)
CPU Time (in seconds) Number of problems solved
600
400
200
0
0 20 40 60 80 100 120 140 160 180
Cactus Plot shown by [Simon 2011] 6 / 60
17. Applications of SAT Technology
Thanks to the remarkable progress of SAT solvers, SAT-based Systems
have been actively studied:
Planning (SATPLAN, Blackbox) [Kautz Selman 1992]
Job-shop Scheduling [Crawford Baker 1994]
Bounded Model Checking [Biere 1999]
Term Rewriting (AProVE) [Giesl et al. 2004]
Constraint Satisfaction Problem (Sugar) [Tamura et al. 2006]
Others
Test Case Generation,
Systems Biology,
Timetabling,
Packing,
Puzzle, and more!
7 / 60
18. Other News around SAT
A SAT solver Sat4j implemented on Java has been integrated into
Eclipse for managing plugins dependencies in their update manager.
Donald E. Knuth gave an invited talk Satis
19. ability and The Art of
Computer Programming at the International Conference on Theory
and Applications of Satis
20. ability Testing 2012.
In addition, SAT will be appeared in Volume 4b of The Art Of
Computer Programming.
Reference to SAT
Biere, A., Heule, M., van Maaren, H., and Walsh, T., editors (2009).
Handbook of Satis
24. Contents of Talk
1 What is SAT?
2 Scarab: SAT-based CP System in Scala
3 Designing Constraint Models in Scarab
4 Advanced Solving Techniques using Sat4j
9 / 60
25. Motivation
Modern fast SAT solvers have promoted the development of
SAT-based systems for various problems.
For an intended problem, we usually need to develop a dedicated
program that encodes it into SAT.
It sometimes bothers focusing on problem modeling which plays an
important role in the system development process.
In this talk
We introduce the Scarab system, which is a prototyping tool for
developing SAT-based systems.
Its features are also introduced through examples of
Graph Coloring and Pandiagonal Latin Square.
10 / 60
26. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
11 / 60
27. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
28. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
Scarab
DSL
SAT Solver
API
CSP Solver
Encoder
API
12 / 60
29. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
30. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
Scarab
DSL
SAT Solver
API
CSP Solver
Encoder
API
800 Lines of Scala
13 / 60
31. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
32. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
Scarab
Program
Scarab
DSL
SAT Solver
API
CSP Solver
Encoder
API
(DSL+Scala)
Encoder
14 / 60
33. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
34. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
CSP Encoder
Scarab
Program
(DSL+Scala)
Scarab
DSL
SAT Solver
API
CSP Solver
API
Encoder
15 / 60
35. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
36. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
Sat4j
CSP Encoder
MAP
SAT
Scarab
Program
(DSL+Scala)
Scarab
DSL
SAT Solver
API
CSP Solver
API
Encoder
16 / 60
37. Scarab
Scarab is a prototyping tool for developing SAT-based Constraint
Programming (CP) systems.
Its major design principle is to provide an expressive, ecient,
customizable, and portable workbench for SAT-based system developers.
It consists of the followings:
1 Scarab DSL: Domain Speci
38. c Language for Constraint Programming
2 API of CSP Solver
3 SAT encoding module
4 API of SAT solvers
Scarab
Program
Sat4j
CSP
Scarab
DSL
SAT Solver
API
CSP Solver
Encoder
CSP
Solution
SAT
SAT
MAP
Decoder Solution
API
(DSL+Scala)
Encoder
17 / 60
39. Other Features
Eciency Scarab is ecient in the sense that it uses an optimized
version of the order encoding for encoding CSP into SAT.
Portability
The combination of Scarab and Sat4j enables the development of
portable applications on JVM (Java Virtual Machine).
Customizability
Scarab is 500 lines long without comments. It allows programmers to
customize their own constraints.
Availability of Advanced SAT Techniques
Thanks to the tight integration to Sat4j, it is available to use several
SAT techniques, e.g., incremental SAT solving.
18 / 60
40. Example of Scarab Program: GCP.scala
Graph coloring problem (GCP) is a
problem of
41. nding a coloring of the
nodes such that colors of adjacent
nodes are dierent.
1
5 2
4
3
1
Input Solution
2
4 3
5
1: import jp.kobe_u.scarab.csp._
2: import jp.kobe_u.scarab.solver._
3: import jp.kobe_u.scarab.sapp._
4:
5: val nodes = Seq(1,2,3,4,5)
6: val edges = Seq((1,2),(1,5),(2,3),(2,4),(3,4),(4,5))
7: val colors = 3
8: for (i - nodes) int('n(i),1,colors)
9: for ((i,j) - edges) add('n(i) !== 'n(j))
10:
11: if (find) println(solution)
19 / 60
42. Imports
import jp.kobe_u.scarab.csp._
import jp.kobe_u.scarab.solver._
import jp.kobe_u.scarab.sapp._
First 2 lines import classes of CSP and CSP solver.
Third line imports the default CSP, Encoder, SAT Solver, and CSP
Solver objects.
It also imports DSL methods provided by Scarab.
int(x, lb, ub) method de
49. ning CSP
for (i - nodes) int('n(i),1,3)
It adds an integer variable to the default CSP object by the int
method.
'n is a notation of symbols in Scala.
They are automatically converted integer variable (Var) objects by an
implicit conversion de
50. ned in Scarab.
for ((i,j) - edges) add('n(i) !== 'n(j))
It adds constraints to the default CSP object.
The following operators can be used to construct constraints:
logical operator: , ||
comparison operator: ===, !==, , =, =,
arithmetic operator: +, -
22 / 60
51. Solving CSP
if (find) println(solution)
The find method encodes the CSP to SAT by order encoding, and
call Sat4j to compute a solution.
solution returns satis
53. Contents of Talk
1 What is SAT?
2 Scarab: SAT-based CP System in Scala
3 Designing Constraint Models in Scarab
4 Advanced Solving Techniques using Sat4j
24 / 60
54. Designing Constraint Models in Scarab
Pandiagonal Latin Square PLS(n) is a problem of placing dierent n
numbers into n n matrix such that each number is occurring exactly
once for each row, column, diagonally down right, and diagonally up right.
alldi Model
One uses alldi constraint, which is one of the best known and most
studied global constraints in constraint programming.
The constraint alldi(a1; : : : ; an) ensures that the values assigned to
the variable a1; : : : ; an must be pairwise distinct.
Boolean Cardinality Model
One uses Boolean cardinality constraint.
25 / 60
66. Scarab Program for alldi Model
1: import jp.kobe_u.scarab.csp._
2: import jp.kobe_u.scarab.solver._
3: import jp.kobe_u.scarab.sapp._
4:
5: val n = args(0).toInt
6:
7: for (i - 1 to n; j - 1 to n) int('x(i,j),1,n)
8: for (i - 1 to n) f
9: add(alldiff((1 to n).map(j = 'x(i,j))))
10: add(alldiff((1 to n).map(j = 'x(j,i))))
11: add(alldiff((1 to n).map(j = 'x(j,(i+j-1)%n+1))))
12: add(alldiff((1 to n).map(j = 'x(j,(i+(j-1)*(n-1))%n+1))))
13: g
14:
15: if (find) println(solution)
36 / 60
67. Encoding alldi
In Scarab, all we have to do for implementing global constraints is
just decomposing them into simple arithmetic constraints [Bessiere et
al. `09].
In the case of alldi(a1; : : : ; an),
It is decomposed into pairwise not-equal constraints
^
1ijn
(ai6= aj )
.
This (naive) alldi is enough to just have a feasible constraint model
for PLS(n).
But, one probably want to improve this :)
37 / 60
68. Extra Constraints for alldi (a1; : : : ; an)
In Pandiagonal Latin Square PLS(n), all integer variables a1; : : : ; an
have the same domain f1; : : : ; ng.
Then, we can add the following extra constraints.
Permutation constraints:
^n
i=1
_n
j=1
(aj = i )
It represents that one of a1; : : : ; an must be assigned to i .
Pigeon hole constraint:
:
^n
i=1
(ai n) ^ :
^n
i=1
(ai 1)
It represents that mutually dierent n variables cannot be assigned
within the interval of the size n 1.
38 / 60
70. alldi (optimized)
def alldiff(xs: Seq[Var]) = f
val lb = for (x - xs) yield csp.dom(x).lb
val ub = for (x - xs) yield csp.dom(x).ub
== pigeon hole
val ph =
And(Or(for (x - xs) yield !(x lb.min+xs.size-1)),
Or(for (x - xs) yield !(x ub.max-xs.size+1)))
== permutation
def perm =
And(for (num - lb.min to ub.max)
yield Or(for (x - xs) yield x === num))
val extra = if (ub.max-lb.min+1 == xs.size) And(ph,perm)
else ph
And(And(for (Seq(x, y) - xs.combinations(2))
yield x !== y),extra)
g
40 / 60
71. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
41 / 60
72. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
42 / 60
73. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
43 / 60
74. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
44 / 60
75. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
45 / 60
76. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
for each pandiagonal (10 pandiagonals) y11k + y22k + y33k + y44k + y55k = 1
46 / 60
77. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
for each pandiagonal (10 pandiagonals) y11k + y22k + y33k + y44k + y55k = 1
47 / 60
78. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
for each pandiagonal (10 pandiagonals) y11k + y22k + y33k + y44k + y55k = 1
48 / 60
79. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
for each pandiagonal (10 pandiagonals) y11k + y22k + y33k + y44k + y55k = 1
49 / 60
80. Boolean Cardinality Model
y11k y12k y13k y14k y15k
y21k y22k y23k y24k y25k
y31k y32k y33k y34k y35k
y41k y42k y43k y44k y45k
y51k y52k y53k y54k y55k
wgh0
wgh/
wgh2
wgh1
wgh3
yijk 2 f0; 1g yijk = 1 , k is placed at (i ; j)
for each value (5 values)
for each row (5 rows) yi1k + yi2k + yi3k + yi4k + yi5k = 1
for each column (5 columns) y1jk + y2jk + y3jk + y4jk + y5jk = 1
for each pandiagonal (10 pandiagonals) y11k + y22k + y33k + y44k + y55k = 1
for each (i ; j) position (25 positions) yij1 + yij2 + yij3 + yij4 + yij5 = 1
50 / 60
81. Scarab Program for Boolean Cardinality Model
1: import jp.kobe_u.scarab.csp._
2: import jp.kobe_u.scarab.solver._
3: import jp.kobe_u.scarab.sapp._
4:
5: for (i - 1 to n; j - 1 to n; num - 1 to n)
6: int('y(i,j,num),0,1)
7:
8: for (num - 1 to n) f
9: for (i - 1 to n) f
10: add(BC((1 to n).map(j = 'y(i,j,num)))===1)
11: add(BC((1 to n).map(j = 'y(j,i,num)))===1)
12: add(BC((1 to n).map(j = 'y(j,(i+j-1)%n+1,num))) === 1)
13: add(BC((1 to n).map(j = 'y(j,(i+(j-1)*(n-1))%n+1,num))) === 1)
14: g
15: g
16:
17: for (i - 1 to n; j - 1 to n)
18: add(BC((1 to n).map(k = 'y(i,j,k))) === 1)
19:
20: if (find) println(solution)
51 / 60
82. SAT Encoding of Boolean Cardinality in Scarab
There are several ways for encoding Boolean cardinality.
In Scarab, we can easily write the following encoding methods by
de
83. ning your own BC methods.
Pairwise
Totalizer [Bailleux `03]
Sequential Counter [Sinz `05]
In total, 3 variants of Boolean cardinality model are obtained.
BC1: Pairwise (implemented by 2 lines)
BC2: Totalizer [Bailleux `03] (implemented by 15 lines)
BC3: Sequential Counter [Sinz `05] (implemented by 7 lines)
Good point to use Scarab is that we can test those models without
writing dedicated programs.
52 / 60
84. Experiments
Comparison on Solving Pandiagonal Latin Square
To show the dierences in performance, we compared the following 5
models.
1 AD1: naive alldi
2 AD2: optimized alldi
3 BC1: Pairwise
4 BC2: [Bailleux `03]
5 BC3: [Sinz `05]
Benchmark and Experimental Environment
Benchmark: Pandiagonal Latin Square (n = 7 to n = 16)
CPU: 2.93GHz, Mem: 2GB, Time Limit: 3600 seconds
53 / 60
85. Results (CPU Time in Seconds)
n SAT/UNSAT AD1 AD2 BC1 BC2 BC3
7 SAT 0.2 0.2 0.2 0.3 0.3
8 UNSAT T.O. 0.5 0.3 0.3 0.3
9 UNSAT T.O. 0.3 0.5 0.3 0.2
10 UNSAT T.O. 0.4 1.0 0.3 0.3
11 SAT 0.3 0.3 2.3 0.5 0.4
12 UNSAT T.O. 1.0 5.3 0.8 0.8
13 SAT T.O. 0.5 T.O. T.O. T.O.
14 UNSAT T.O. 9.7 32.4 8.2 6.8
15 UNSAT T.O. 388.9 322.7 194.6 155.8
16 UNSAT T.O. 457.1 546.6 300.7 414.8
Only optimized version of alldi model (AD2) solved all instances.
Modeling and encoding have an important role in developing SAT-based
systems.
Scarab helps users to focus on them ;)
54 / 60
86. Contents of Talk
1 What is SAT?
2 Scarab: SAT-based CP System in Scala
3 Designing Constraint Models in Scarab
4 Advanced Solving Techniques using Sat4j
55 / 60
87. Advanced Solving Techniques using Sat4j
Thanks to the tight integration to Sat4j, Scarab provides the
functions: Incremental solving and CSP solving with assumptions.
We explain it using the following program.
1: int('x, 1, 3)
2: int('y, 1, 3)
3: add('x === 'y)
4: find // first call of find
5: add('x !== 3)
6: find // second call of find
7:
8: find('y === 3) // with assumption y = 3
9: find('x === 1) // with assumption x = 1
56 / 60
88. Incremental SAT Solving
int('x, 1, 3)
int('y, 1, 3)
add('x === 'y)
find // first call of find
add('x !== 3)
find // second call of find
In the
89. rst call of find method, the whole CSP is encoded and
generated SAT clauses are added to Sat4j, then it computes a
solution.
In the second call of find method, only the extra constraint x6= 3 is
encoded and added to Sat4j, then it computes a solution.
The learned clauses obtained by the
91. CSP Solving under Assumption
find('y === 3) // with assumption y = 3
find('x === 1) // with assumption x = 1
find(assumption: Constraint) method provides CSP solving
under assumption given by the speci
92. ed constraint.
The constraint of assumption should be encoded to a conjunction of
literals (otherwise an exception is raised).
Then, the literals are passed to Sat4j, then it computes a solution
under assumption.
We can utilize those techniques for optimization and enumeration
problems.
58 / 60
93. Conclusion
Introducing Architecture and Features of Scarab
Using Scarab, we can write various constraint models without
developing dedicated encoders, which allows us to focus on problem
modeling and encoding.
Future Work
Introducing more features from Sat4j
Sat4j has various functions of
94. nding MUS, optimization, solution
enumeration, handling natively cardinality and pseudo-Boolean
constraints.
URL of Scarab http://kix.istc.kobe-u.ac.jp/~soh/scarab/
59 / 60
95. References I
Biere, A., Heule, M., van Maaren, H., and Walsh, T., editors (2009).
Handbook of Satis
97. cial
Intelligence and Applications (FAIA). IOS Press.
Cook, S. A. (1971).
The complexity of theorem-proving procedures.
In Proceedings of the 3rd Annual ACM Symposium on Theory of
Computing (STOC 1971), pages 151{158.
Davis, M., Logemann, G., and Loveland, D. W. (1962).
A machine program for theorem-proving.
Communications of the ACM, 5(7):394{397.
60 / 60