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.
The thing is, I didn't want to stick to just a simple question of "Who owns the fish?". I wanted to model a harder question. For example: "What pet does the person who lives in the house which is to the right of the red house own?". It appears to be a simple check for the index i in the list which has the tuple with the color red, and return the field pet of the tuple at the index i+1 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.
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) .
persoane(2,X)?','(1,','(2,','(3,','(4,5)))). (Usewrite_canonical/1to see this). I think you want to use regular lists, e.g.[1,2,3,4,5]. Your system might have a predicatenth0/3ornth1/3--- take a look at how it's implemented.