I don't have the time to work on this myself but I'd more than welcome a "Translations from Prolog" page on the core.logic GitHub wiki.
David On Mon, Jun 11, 2012 at 11:31 AM, Jim - FooBar(); <jimpil1...@gmail.com>wrote: > Thanks a million mnicky!!! > A simple explanation like yours is just what I needed...I think i get the > rationale... > > however, how would I know which of the 8 functions to call when the time > comes to consume it? I can see 8 move predicates with identical > signatures...how would i call them and how would the system know which one > to fire? > > I may disturb you again in the near future perhaps once I dive deeper into > logic...I also need to learn how to translate prolog syntax to > core.logic.... > > Jim > > > > On 11/06/12 13:00, mnicky wrote: > > Although I am familiar with Prolog, I'm not very familiar with core.logic > yet :-( > But maybe I can provide you an explanation of that Prolog code and you can > derive the core.logic implementation by yourself... > > All clauses you provided define one predicate, move(), which has two > arguments and both of them are lists of four variables (e.g. [A,B,C,D] is > also a list of four variables). > > This predicate defines a relationship between those two lists. > Given the first list with provided concrete values, the predicate will > assign all possible values to the elements of the second list. > > These values must fulfill the contract, defined by the body of the > predicate... > > E.g. let's take this one: > > --------------- > move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- > X + 1 < Xmax, > Y + 2 < Ymax, > A is X + 1, > B is Y + 2. > --------------- > > This basically means, that if you call: "move([1, 2, 5, 6], [A, B, Xmax, > Ymax])." > you will be given all the possible values of A, B, Xmax and Ymax such that > this will hold true: > X + 1 < Xmax && Y + 2 < Ymax && A = X + 1 && B = Y + 2 > > concretely, you will receive the values: > A = 2, > B = 4, > Xmax = 5, > Ymax = 6. > > (The last two are the same that were provided when calling the > predicate.) > > The last information is, that there is a "logical OR" between all the 8 > provided "move()" expressions, so that whichever of them can found at least > one valid solution, it will be used. It's like as if they were the lines of > a "conde" in core.logic. > > > I hope that this can help you at least a little. > If you have any questions, just ask ;-) > > Marek. > > P.S. My apologize to all the Prolog programmers here for simplified (and > not always correct) Prolog terminology... > > > On Monday, June 11, 2012 12:25:49 PM UTC+2, Jim foo.bar wrote: >> >> I managed to find this piece of prolog code in >> http://bkraabel.free.fr/pages/kmoves_pl.html#top >> of page <http://bkraabel.free.fr/pages/kmoves_pl.html#top%20of%20page>but I >> don't know how to read it! Can anyone help me translate that to >> core.logic so i have a starting point? checkers also move similarly to >> knights (but just one position at a time)... >> >> % The following 8 moves define all the possible moves a knight >> % may make on a chess board, without leaving the chess board. The >> % size of the chess board is given by (Xmax, Ymax). >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X + 1 < Xmax, >> Y + 2 < Ymax, >> A is X + 1, >> B is Y + 2. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X + 2 < Xmax, >> Y + 1 < Ymax, >> A is X + 2, >> B is Y + 1. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X + 2 < Xmax, >> Y - 1 >= 0, >> A is X + 2, >> B is Y - 1. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X + 1 < Xmax, >> Y - 2 >= 0, >> A is X + 1, >> B is Y - 2. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X - 1 >= 0, >> Y - 2 >= 0, >> A is X - 1, >> B is Y - 2. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X - 2 >= 0, >> Y - 1 >= 0, >> A is X - 2, >> B is Y - 1. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X - 2 >= 0, >> Y + 1 < Ymax, >> A is X - 2, >> B is Y + 1. >> >> move([X, Y, Xmax, Ymax], [A, B, Xmax, Ymax]) :- >> X - 1 >= 0, >> Y + 2 < Ymax, >> A is X - 1, >> B is Y + 2. >> >> >> Jim >> >> On 11/06/12 01:09, Jim - FooBar(); wrote: >> >> Hello everyone, >> >> I'm trying to decide if its worth writing the rules of chess/checkers >> using core.logic or go down the conventional road but unfortunately I'm >> inexperienced as far as core.logic goes. I mean I've played around for a >> bit but nothing serious. >> >> What I want is NOT AI or anything like that...all I want is to encode the >> rules of the game somehow so i can then pass a board and a piece to some >> function that will be able to find all available moves that don't violate >> the rules of the game - no picking the best move or anything like >> that...just finding the legal moves efficiently...does this sound >> reasonable? I'm surprised there are so little on-line resources on the >> matter! >> >> if someone can explain the advantages and the disadvantages of of doing >> so that would be fanatstic...Even better if someone can point me in the >> right direction (some similar project perhaps). I really have no idea how >> to start and its one of the few times g8ggle doesn't seem to help... >> >> thanks in advance... >> >> >> Jim >> >> >> -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en