2

  1. Given the Prolog database and rules shown below, what is the output of the Prolog query that follows?

       child_of(mary, steve).
       child_of(mary, anne).
       child_of(alice, anne).
       child_of(alice, steve).
       child_of(jane, steve).
       child_of(leslie, steve).
       female(mary).
       female(alice).
       female(jane).
    
       sisters(Person1, Person2) :-
          child_of(Person1, Parent1),
          child_of(Person1, Parent2),
          child_of(Person2, Parent1),
          child_of(Person2, Parent2),
          not(Parent1 = Parent2),
          female(Person1),
          female(Person2),
          not(Person1 = Person2).
       

    Query:

    ?- sisters(Sis1, Sis2).

    Answer:

    Sis1 = mary,
    Sis2 = alice;
    
    Sis1 = mary,
    Sis2 = alice;
    
    Sis1 = alice,
    Sis2 = mary;
    
    Sis1 = alice,
    Sis2 = mary;
    
    false.

    Comment:Essentially there are two persons here who are sisters, namely mary and alice, so we intuitively expect a single answer, effectively verifying that sisters(mary, alice). is true. However, Prolog also proves sisters(alice, mary). which doubles the number of solutions found. It also proves each of these two ways, binding Parent1 to steve and Parent2 to anne in one case, and vice-versa in the other case, again doubling the number of solutions (to give 4 altogether).