bug-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: All constraints not met in results.


From: Daniel Diaz
Subject: Re: All constraints not met in results.
Date: Sun, 15 Jul 2012 11:29:10 +0200

Hi Mark,

there is no bug here. It is your Prolog formulation which is wrong.
E.g. \== does not really work with variables. Try:

| ?- X = foo, X \== foo.

no
| ?- X \== foo, X = foo.

X = foo

yes

So the order of calls is relevant if you use \==. In solve you call fact1 (which calls \==) before variables have values so \== does not work as you expect. 

Daniel

Le 10 juil. 2012 à 18:23, Mark Roulo a écrit :

1) The type of machine you are using (use uname -a under Unix).

   uname -a
   Darwin Mark-Roulos-MacBook-Pro.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:32:41 PDT 2011;
   root:xnu-1504.15.3~1/RELEASE_X86_64 x86_64

2) GNU Prolog version (use gprolog --version)

   gprolog --version
   Prolog top-Level (GNU Prolog) 1.4.1
   By Daniel Diaz
   Copyright (C) 1999-2012 Daniel Diaz

   GNU Prolog comes with ABSOLUTELY NO WARRANTY.
   This is free software; see the source or the file
   named COPYING for copying conditions.

   NOTE that this also shows up in 1.4.0.

3) The operands given to the `configure' and the output of the configuration if the bug concerns the compilation/installation phase.

   N/A.  The problem is not in the compilation/installation phase.
   In any event, I used:
       ./configure
       make
       make install

4) The complete text of any files needed to reproduce the bug. Try to obtain a minimal example showing the bug.

   See below

5) The precise commands we need to type to reproduce the bug.

       gprolog --consult-file bug.pl

       | ?- solve(S).

       S = [[andrew,corey,sandy,doru],[doru,corey,andrew,sandy]] ? ;
 
       S = [[andrew,sandy,corey,doru],[doru,corey,andrew,sandy]] ? ;

       S = [[sandy,andrew,corey,doru],[doru,corey,sandy,andrew]] ? ;

       (1 ms) no
       | ?- solve2(S).

       S = [[sandy,andrew,corey,doru],[doru,corey,sandy,andrew]] ? ;

       (3 ms) no
       | ?-

6) A description of what behavior you observe that you believe is incorrect.

     solve and solve2 are identical except for the order of the clauses.

     I would expect that:
         (a) The results would be the same (except for order, maybe), and
         (b) That they would both be correct.

     solve() gives the wrong result ... the first two results above do not
     meet all the constraints (see fact1 below).

     This seems wrong.  On the other hand, I'm still learning Prolog, so it
     is also possible that the two *should* be different and I just don't know
     what I'm doing ... :-)

Regards,
    -Mark Roulo


Source for bug.pl
================================================================================
/*  
    Problem lifted from: http://www.anselm.edu/internet/compsci/Faculty_Staff/mmalita/HOMEPAGE/logic/aa1.txt

     File: aa1.pl
     Author: (sol MM)
     Title: Contest: swimming and biking
     From: Prof. Adrian Atanasiu: http://www.galaxyng.com/potw/

Four students competed in two different tests: swimming and biking.
Can you establish the final order for each test?
1. Andrew did not win any competition.
2. The person who won the swimming contest was the third
   at the bike competition.
3. Andrew did better than Corey at the swimming contest,
   but Corey was better than Andrew at the bike contest.
4. Corey was never the last.
5. Doru won the bike contest,
   but Sandy was better than him at the swimming contest.
What was the winning order in the swimming and bike contest?

?- start,fail.
Swimming contest=[sandy,andrew,corey,dan]
Bike contest= [dan,corey,sandy,andrew]
no
*/

sets_match([], S) :- length(S,0), !.
sets_match(S1, S2) :-
    S1 = [H | T],
    nth(_, S2, H),         % Can we find H in S2
    delete(S2, H, S3),     % If so, remove H from S2
    sets_match(T, S3).     % Do this again on T and S2 - H.

fact1(Solution) :-                          % Andrew never won
    Solution = [[A,_,_,_],[B,_,_,_]],
    A \== andrew,
    B \== andrew.

fact2(Solution) :-                          % Winner of swimming was 3rd at biking
    Solution = [[C,_,_,_],[_,_,C,_]].

fact3(Solution) :-
    nth(1, Solution, Swimming),
    nth(2, Solution, Biking),

    nth(AS, Swimming, andrew),
    nth(CS, Swimming, corey),

    nth(AB, Biking, andrew),
    nth(CB, Biking, corey),

    AS < CS,
    CB < AB.

fact4(Solution) :-                        % Corey was never last
    Solution = [[_,_,_,D],[_,_,_,E]],
    D \== corey,
    E \== corey.

fact5(Solution) :-
    Solution = [Swimming, [doru,_,_,_]],
    nth(DoruSwimming,  Swimming, doru),
    nth(SandySwimming, Swimming, sandy),
    SandySwimming < DoruSwimming.

no_dups(Solution) :-
    Solution = [Swimming, Biking],
    sets_match(Swimming, [doru, sandy, corey, andrew]),
    sets_match(Biking,   [doru, sandy, corey, andrew]).


solve2(Solution) :-
    no_dups(Solution),
    fact1(Solution),
    fact2(Solution),
    fact3(Solution),
    fact4(Solution),
    fact5(Solution).


solve(Solution) :-
    fact1(Solution),
    fact2(Solution),
    fact3(Solution),
    fact4(Solution),
    fact5(Solution),
    no_dups(Solution).



--
Ce message a été vérifié par MailScanner pour des virus ou des polluriels et rien de suspect n'a été trouvé.
_______________________________________________
Bug-prolog mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/bug-prolog


--
Ce message a été vérifié par MailScanner pour des virus ou des polluriels et rien de suspect n'a été trouvé.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]