Re: prolog and backtracking

Markus Triska <triska@logic.at>
Mon, 24 Sep 2007 03:34:06 +0200

          From comp.compilers

Related articles
prolog and backtracking the_evil_trembles@yahoo.com (James Sison) (2007-09-22)
Re: prolog and backtracking triska@logic.at (Markus Triska) (2007-09-24)
Re: prolog and backtracking haberg@math.su.se (2007-09-24)
| List of all articles for this month |
From: Markus Triska <triska@logic.at>
Newsgroups: comp.compilers
Date: Mon, 24 Sep 2007 03:34:06 +0200
Organization: Compilers Central
References: 07-09-087
Keywords: prolog
Posted-Date: 23 Sep 2007 22:31:51 EDT

James Sison <the_evil_trembles@yahoo.com> writes:


> but jake has already been found and it should be different from the
> result of the first parent.


You can state this constraint in Prolog, using e.g. dif/2 or \==/2:


      sibling(X,Y):- dif(X, Y), parent(bill,X), parent(bill,Y).


You could also omit symmetrical solutions using e.g. @</2:


      sibling(X,Y):- parent(bill,X), parent(bill,Y), X @< Y.


This is hardly advisable though, since sibling/2 is after all a
symmetrical relation in reality, whereas you'd have for example:


      %?- sibling(jake, ruby).
      %@ Yes


      %?- sibling(ruby, jake).
      %@ No


> Is there a simpler way to address this problem?


Consider the built-in predicates setof/3 or findall/3, which you can
use to find all solutions; sort to eliminate duplicates if necessary:


      %?- findall(X-Y, sibling(X, Y), XYs0), sort(XYs0, XYs).
      %@ XYs0 = [jake-ruby, ruby-jake, jake-ruby, ruby-jake],
      %@ XYs = [jake-ruby, ruby-jake]


>From this list you can easily generate your facts in Prolog (tested
with SWI-Prolog, where $XYs refers to the previous toplevel binding):


      %?- forall(member(X-Y, $XYs), format("sibling(~w, ~w).\n", [X,Y])).


Output:


      sibling(jake, ruby).
      sibling(ruby, jake).



Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.