title: Is there a way to extend Einstein's Riddle in Prolog?
body: <p>First off, thank you for dropping by my question. On to the question, I have been working on a Prolog code to model Einstein's riddle. I think it's a pretty elegant solution, it's basically a list of tuples with certain fields such as house color, pet, nationality etc. I have the list modeled and the hints are there as well, but I'm having trouble trying to model the question.</p>
  <p>The thing is, I didn't want to stick to just a simple question of &quot;Who <em>owns</em> the <em>fish</em>?&quot;. I wanted to model a harder question. For example: &quot;What <em>pet</em> does the person who lives in the house which is <em>to the right</em> of the <em>red</em> house <em>own</em>?&quot;. It appears to be a simple check for the index <code>i</code> in the list which has the tuple with the color <code>red</code>, and return the field <code>pet</code> of the tuple at the index <code>i+1</code> in the list, but my experience with Prolog is pretty limited (it is virtually my first time using it) and I'm not really sure how to implement it. I'll provide the code I have below. I appreciate all answers. Thank you.</p>
  <pre><code>persoane(0, []) :- ! .
  persoane(N, [(_Men, _Color, _Drink, _Smoke, _Animal)|T]) :- N1 is N-1, persoane(N1,T) .
  
  persoana(1, [H|_], H) :- ! .
  persoana(N, [_|T], R) :- N1 is N-1, persoana(N1, T, R)
  
  % Function that tests if A is to the right of B (will be used in the final question)
  right(A, B, List) :- nextto(B, A, List).
  
  % The Brit lives in the red house
  hint1([(brit, red, _, _, _)|_]) .
  hint1([_|T]) :- hint1(T) .
  
  % The Swede keeps dogs as pets
  hint2([(swede, _, _, _, dog)|_]) .
  hint2([_|T]) :- hint2(T) .
  
  % The Dane drinks tea
  hint3([(dane, _, tea, _, _)|_]) .
  hint3([_|T]) :- hint3(T) .
  
  % The green house is on the left of the white house
  hint4([(_, green, _, _, _,),(_, white, _, _, _)|_]) .
  hint4([_|T]) :- hint4(T) .
  
  % The green house owner drinks coffee
  hint5([(_, green, cofee, _, _)|_]) .
  hint5([_|T]) :- hint5(T) .
  
  % The person who smokes Pall Mall rears birds
  hint6([(_, _, _, pallmall, bird)|_]) .
  hint6([_|T]) :- hint6(T) .
  
  % The owner of the yellow house smokes Dunhill
  hint7([(_, yellow, _, dunhill, _)|_]) .
  hint7([_|T]) :- hint7(T) .
  
  % The man living in the center house drinks milk
  hint8(persoane) :- persoana(3, persoane, (_, _, milk, _, _)) .
  
  % The Norwegian lives in the first house
  hint9(persoane) :- persoana(1, persoane, (norwegian, _, _, _, _)) .
  
  % The man who smokes Blends lives next to the one who keeps cats
  hint10([(_, _, _, blend, _),(_, _, _, _, cat)|_]) .
  hint10([(_, _, _, _, cat),(_, _, _, blend, _)|_]) .
  hint10([_|T]) :- hint10(T) .
  
  % The man who keeps horses lives next to the man who smokes Dunhill
  hint11([(_, _, _, dunhill, _),(_, _, _, _, horse)|_]) .
  hint11([(_, _, _, _, horse),(_, _, _, dunhill, _)|_]) .
  hint11([_|T]) :- hint11(T) .
  
  % The owner who smokes BlueMaster drinks beer
  hint12([(_, _, beer, bluemaster, _)|_]) .
  hint12([_|T]) :- hint12(T) .
  
  % The German smokes Prince
  hint13([(german, _, _, prince, _)|_]) .
  hint13([_|T]) :- hint13(T) .
  
  % The Norwegian lives next to the blue house
  hint14([(norwegian, _, _, _, _),(_, blue, _, _, _)|_]) .
  hint14([(_, blue, _, _, _),(norwegian, _, _, _, _)|_]) .
  hint14([_|T]) :- hint14(T) .
  
  % The man who smokes Blend has a neighbour who drinks water
  hint15([(_, _, _, blend, _),(_, _, water, _, _)|_]) .
  hint15([(_, _, water, _, _),(_, _, _, blend, _)|_]) .
  hint15([_|T]) :- hint15(T) .
  
  % The question: What pet does the man who lives to the right of the red house have ?
  % question (right((_, _, _, _, _), (_, red, _, _, _), persoane)) .
  question([(_, red, _, _, _),()])
  question([_|T]) :- question(T) .
  
  solution(persoane) :-
     persoana(5, persoane),
     hint1(persoane),
     hint2(persoane),
     hint3(persoane),
     hint4(persoane),
     hint5(persoane),
     hint6(persoane),
     hint7(persoane),
     hint8(persoane),
     hint9(persoane),
     hint10(persoane),
     hint11(persoane),
     hint12(persoane),
     hint13(persoane),
     hint14(persoane),
     hint15(persoane),
     question(persoane) .
  
  </code></pre>