9 ms·
Hello, declarative world
- decasia 11y agoI thought this was interesting and very well put together. Can anyone with more of a CS background provide any additional context here? I gather from the article like there is a small but growing domain of these "relational" languages.
- sevensor 11y agoLike the author said, this is an old idea that's recently been revived. (I agree that the article was quite well done.) Most of the ideas he described, like goals and unification, have been a feature of logic programming for ages. Prolog is the classic language in logic programming --- it attracted major interest during the AI bubble in the 1980s and survives mainly as an educational language today. It's worth a look, particularly since there are so many educational materials available.
- coliveira 11y agoThis is an idea that has been implemented in Prolog for 30 years, and it can also be implemented in Lisp with some effort, similarly to the presentation in this post. If you really want to know what this can do, just get a few Prolog books such as "the craft of Prolog". The language is easy to understand, and the ideas behind it can be used in many other languages.
- bwanab 11y agoDavid Nolan has a very nice introduction with examples using Clojure as the base language: https://github.com/swannodette/logic-tutorial https://github.com/swannodette/logic-tutorial.
- nickpsecurity 11y agoIt can help in this and similar discussion to start with Wikipedia's Programming Paradigms (see right side). Just go through them, look at the examples, and go to papers or web site of more promising ones (esp actively developed). So, top in logic programming last I checked was Mercury language. They probably have good articles, examples, whatever on their site. Here's some other examples from those pages: https://en.wikipedia.org/wiki/Declarative_programming https://en.wikipedia.org/wiki/Declarative_programming https://en.wikipedia.org/wiki/Database_query_language https://en.wikipedia.org/wiki/Database_query_language https://en.wikipedia.org/wiki/Logic_programming https://en.wikipedia.org/wiki/Logic_programming https://en.wikipedia.org/wiki/Inductive_programming https://en.wikipedia.org/wiki/Inductive_programming You'll probably have the most fun with those. Might take you months to dig through all of that if you're following up on the various types with further research. You'll also be one of the only ones that know what the hell you're talking about when topic comes up next in form of "what can or can't it do?" ;)
- putzdown 11y agoThis is a well-expressed defense of declarative concepts but the title itself highlights the Achille's heel of these ideas: how, after all, do you simply make the computer do something, like print "Hello, World" at a particular place and time? Declarative techniques are great for the things that they're great for, but programmers who hate side effects have the problem that every program that does anything observable does it through side effects. So I continue to sit on the declarative fence.
- gizmo686 11y agoYou declare that you want it to print "Hello, World" at said place and time.
- notNow 11y agoHow so? What you're saying amounts to basically an instruction not a relation or declaration in the programming sense of the word.
- crdoconnor 11y agoUsing HTML? It's a declarative language.
- notNow 11y agoHow would you specify the starting time of execution in HTML documents?
- gizmo686 11y agoGiven the current specs, I am not aware of any way to do it, but in theory, you could do something like: <div visible="after:5pm"> hello world </div>
- dragonwriter 11y agoUsing a poshformat (which, if the use case was general enough, might be formalized into a microformat.) [0] Probably leveraging the HTML time element. Of course, that lets you specify the execution time, but unless you have a system consuming the format that is aware of the additional semantics beyond the base HTML semantics, specifying that won't do anything. [0] http://microformats.org/wiki/poshformats http://microformats.org/wiki/poshformats
- Jemaclus 11y agoThis is pretty well done. I've always been a bit lost on the differences between imperative and declarative programming. Each time I've asked, I've gotten incredulous "You mean you don't KNOW?" And then they start off with technobabble buzzwords that are meaningless to me. I appreciate this post, because it works from first principles (close enough) and moves toward more abstract concepts. Good storytelling guide here.
- deleted 11y ago[deleted]
- kpmah 11y agoThis looks like it's effectively Prolog, and the problems with this way of programming can be found in criticisms of that class of programming languages. I haven't written a Prolog program of any complexity myself, but it seems a common complaint is that the programs can be hard to reason about and debug. Your solutions are always running on top of a unification algorithm.
- harperlee 11y agoMuch of the criticisms that I've read about prolog are very specific about prolog (I am not an expert here, though). Further, the fact that prolog-like languages (be kanren-like languages part of those or not) have issues should not be a basis for discarding all of them. Useful niches can be found, and their problems might be solved. More in general, the idea that I can take a function, and provide an argument less, and a result, and the function is inverted (in a mathematical sense) for free, seems very, very powerful. The main alternative is to have two functions, one the inverse of another, that use the same building blocks for reuse, but that puts a cognitive overhead to the program, whereas a person understands most inversions quite easily.
- kpmah 11y agoIt's a really interesting area, but I think anyone who wants to push for this style of programming would do well to investigate why Prolog never really took off in the 40 years it's been around. Of course, that could have nothing to do with its fundamental model.
- nickpsecurity 11y agoI agree. Prolog isn't logic programming: it's a specific approach to first-order, logic programming. So, it's failures can't be considered failures of first-order or other logic programming by default. One has to look at the nature of the failure to determine where the blame is. Then see if there's a way to fix that. And if not, only then say "This appears to be a weakness of X that justifies using a different tool." That said, most work that's successful avoids first-order logic in favor of tools such as Isabelle/HOL or Coq. They also support extraction to Ocaml, etc w/ certified compilers in works for them. Maybe better to use those for logic programming. I'm not a domain expert in that field so can't be sure. For people doing first-order, though, the Mercury language and Visual Prolog app are best I know of with plenty examples.
- notNow 11y agoInstead of the declarative/imperative paradigm and the ongoing shift to more functional flavoured languages and more abstractions crammed under the hood, I prefer instead multi-paradigm languages like JS to be the languages of the future. Multi-paradigs languages, if done right, combine the best of two imperative & declarative worlds beside they're very friendly to beginners and they don't have this intimidating quality that other "pure" languages like Haskell have. Also, procedural coding is easy to do and carries low mental overhead in writing and not every programming problem has be modeled in functional terms or worldview to be solved. Sometimes, it's economical and efficient just to get the work done in two lines of code without going through all those functional hoops just to capture a field value in some form.
- gizmo686 11y agoEven multi-paradigm languages need to choose a dominant paradigm. Javascript supports functional style programming, but it is still in the context of an imperitave language. In the same way, Haskell supports imperitive programming, but it has to be done within the context of a functional language. Also, in my opinion, the intimidating part of Haskell is not its purity, but rather its type system.
- davexunit 11y agoScheme is a good multi-paradigm language, as evidenced by how it easily it could be taught a brand-new paradigm, relational programming, with miniKanren. Scheme programs are typically written in a functional style, but it has the notion of set! for mutating variables so you program imperatively when you need to.
- munro 11y agoOr Lisp! This is the reason JavaScript has been described as "Lisp in C's Clothing". Though, I haven't used clojurescript as much as I'd like, I have Stockholm syndrome.
- nickpsecurity 11y agoI agree with gizmo. All of the languages boil down to some model that you build everything else around. It restricts what you can do. A good model enables way more than it restricts. Seeing what's been done, I vote for a Lambda Calculus-like model along likes of Scheme because it's already emulated everything else pretty well. Very powerful. Just gotta simplify it so it doesn't have LISP's weird stuff. Been looking into REBOL/Red recently as they might do that. Btw, a universal machine for all paradigms was already done with RISE CPU's tagged/typed operations + Ten15 VM. I'd like to see an optimized version of Ten15 get takeup. Javascript, on other hand, is garbage that's a LCD at best. Even Oberon in the browser (Juice project) outdid it in about every attribute. http://mca-ltd.com/martin/Ten15/introduction.html http://mca-ltd.com/martin/Ten15/introduction.html
- timothycrosley 11y agoI think the best way to move away from the way computers think, is just to build higher level functions and utilities. For example: https://github.com/timothycrosley/hug https://github.com/timothycrosley/hug
- kragen 11y agoIt seems bizarre to me that someone could write an article about relational programming without even mentioning miniKanren, which can do things like find quines, given a relational specification for a language interpreter: http://webyrd.net/quines/quines.pdf http://webyrd.net/quines/quines.pdf — and it’s in the Clojure standard library as core.logic: https://clojure.github.io/core.logic/ https://clojure.github.io/core.logic/ miniKanren solves a lot of the limitations that systems like Prolog had, at the cost of some performance. The old miniKanren web page explains, "KANREN is a declarative logic programming system with first-class relations, embedded in a pure functional subset of Scheme. The system has a set-theoretical semantics, true unions, fair scheduling, first-class relations, lexically-scoped logical variables, depth-first and iterative deepening strategies. The system achieves high performance and expressivity without cuts." https://stackoverflow.com/questions/28467011/what-are-the-main-technical-differences-between-prolog-and-minikanren-with-resp https://stackoverflow.com/questions/28467011/what-are-the-ma... talks a bit more about the differences. (Also, the article didn't mention Prolog. What's up with that?) (I don't have any experience with miniKanren myself.)
- ryanmarsh 11y agoI'm not sure whether you read the article or not, or if the author updated it in between the time you read it and posted your comment, but I finished reading it before your comment was posted and the author did, in that frame of reference, in fact mention miniKanren.
- harperlee 11y ago> Surprisingly, these six pieces are enough to make a simple relational language called μKanren. It was presented in a paper published only two years ago, in 2013, by Jason Hemann and Daniel Friedman. > μKanren is part of the miniKanren family of languages. The full miniKanren language has more complex primitives that can be built out of the μKanren ones I’ve shown you.
- 0xdeadbeefbabe 11y ago> We’re still stuck with mostly “von Neumann style” languages that talk about state and assignment and memory and stuff — computer things, not idea things. Maybe there is a good reason for this beyond something simple like inertia? On the other hand I sure don't want to be stuck doing backward things—wait a minute—is this more pop culture masquerading as insight?
- lucio 11y ago1.With “von Neumann style” you are closer to the metal. 2.With "declarative", (e.g. SQL) you're preparing input data -NOT describing an algorithm- for a runtime or a compiler or a server, which in turns will run “von Neumann style” algorithms composed from your declarations. If you need to optimize the last drop of resource usage and speed you use 1).
- nickpsecurity 11y agoMaybe. There were LISP machines developed that did all that natively. The metal was a high-level language of incredible power with good implementations doing low-cost abstractions via macros. Almost all investment went to the other architectures for sheer price/performance and backward compatibility. Reliability, maintenance, integration of 3rd party code, security, etc weren't a concern at all. Now they are: even mainstream is tossing much of the old stuff where possible. Your same argument might have worked in reverse had several billion dollars of engineering gone into hardware designed to implement ML, Scheme, Haskell, and so on. Besides, there's little debate to be had on what's the best model: all of these are built on hardware that's interacting functional programs (combinatorial logic) and finite state machines (sequential logic). How they're combined varies on a chip by chip basis. Underneath, though, everything boils down to a careful combination of functional and semi-functional programming implemented in silicon. Except analog which is purely functional. ;) Note: This brings out another angle whereby we use tens of thousands to billions of circuits running concurrently in a functional way to simulate a sequential, imperative machine that does way less in a clock cycle. This is why porting the algorithms onto FPGA's almost always has significant speed-up unless the imperative machine is insanely optimized (i.e. Intel/AMD/IBM). It's also why even prototypes like SHard produce efficient, better-than-generic hardware from functional language specifications of algorithms. Maybe we should just go functional all the way and invest money into CPU's which do that with utmost efficiency, eh?
- davexunit 11y agoNow, go pick up The Reasoned Schemer! https://mitpress.mit.edu/books/reasoned-schemer https://mitpress.mit.edu/books/reasoned-schemer
- richardjdare 11y agoI've always found 'declarativism' in general to be very hard to understand. I was terrible at maths until I became a programmer and was able to concretely explore the mechanics of number using imperative programming languages. For many years, post-high school mathematics was incomprehensible to me and languages like Haskell seemed like absurd contrivances when placed next to the concrete reality of C compilers and CPU clock cycles. It was only by butting my head against mathematics again and again, and by easing my way into functional programming via Javascript that I began to understand declarative thought, and what it meant to perceive logic in a static picture rather than as the expression of some concrete action. I still don't get it it's foreign to my way of thinking, but I know what it looks like now. I enjoyed this article a great deal, but my hackles did rise somewhat at the author's assumption that declarativism is somehow closer to human thinking than imperativism. It is more abstract, yes, and maybe more familiar to a natural mathematician, but I do not believe declarativism has a special status with regard to human thought. I don't think it would be a poor hypothesis to suggest that many people reason using a much softer, more "narrativ-istic" kind of thinking than is represented by mathematics. This kind of thinking is closer to imperative programming which often seems like you are telling a story about how to solve a problem - the details of the computer's memory and CPU being the indispensable forest and woodcutter's axe of the tale. I think that a lot of the proponents of declarative programming (and functional programming for that matter) are mathematically talented people who are cognitively inclined to understand things in that way - just as the positive features of imperative (and object oriented) languages are similarly attractive and seemingly fundamental, to other kinds of thinkers.
- xamuel 11y agoI'm a mathematician and I'll be the first to say, this "declarative = mathematical" meme is completely inaccurate. If you look at most mathematical theorems and proofs, they are mostly imperative. Take for example the proof there are infinitely many primes. "Assume there are only finitely many primes (assume: imperative). Let them be called p_1,...,p_n (let: imperative). Let q=(p_1...p_n)+1 (let: imperative). Then q is not divisible by any of p_1,...,p_n, so q is prime (this is the only non-imperative line in the proof). Contradiction, discard the assumption and conclude there are infinitely many primes (imperative)." The biggest "non-imperative" feature of mathematics is the way functions are first-class objects. But that's only considered to be "non-imperative" because of a historical fluke, there's no intrinsic reason why "first class functions" = "non-imperative", it's just that the early languages happened to be that way.
- dwenzek 11y agoHere is a very insightful post: "What, If Anything, Is A Declarative Language?" (https://existentialtype.wordpress.com/2013/07/18/what-if-anything-is-a-declarative-language/ https://existentialtype.wordpress.com/2013/07/18/what-if-any...). Written by a functional programming fellow, Robert Harper, this post is not a rant around the claim we can't escape the procedural effectful world. It's rather a call for the awareness that the "how" is a fundamental issue in programming.