YieldProlog_Einsteins_Riddle

175 days ago by PatrickHammer

%hide from YP import * from Atom import * from Compiler import * from ListPair import * from Variable import * from cStringIO import StringIO import sys sys.setrecursionlimit(10000) def PROLOG(prologCode): code=StringIO();YP.tell(code) YP.see(YP.StringReader(prologCode)) TermList = Variable(); PseudoCode = Variable() for l1 in parseInput(TermList): for l2 in makeFunctionPseudoCode(TermList, PseudoCode): convertFunctionPython(PseudoCode) YP.seen() return code.getvalue() 
       
def printit(a): print a yield false str=PROLOG(""" :- import('',[member/2,printit/1]). erstes(E,[E|_]). links(A,B,[A|[B|_]]). links(A,B,[_|R]) :- links(A,B,R). mittleres(M,[_,_,M,_,_]). neben(A,B,L) :- links(A,B,L);links(B,A,L). run :- X = [_,_,_,_,_], /* Es gibt (nebeneinander) 5 (noch unbekannte) Häuser */ member([rot,brite,_,_,_],X), /* Der Brite lebt im roten Haus */ member([_,schwede,_,_,hund],X), /* Der Schwede hält einen Hund */ member([_,daene,tee,_,_],X), /* Der Däne trinkt gern Tee */ links([gruen,_,_,_,_],[weiss,_,_,_,_],X), /* Das grüne Haus steht links vom weißen Haus */ member([gruen,_,kaffee,_,_],X), /* Der Besitzer des grünen Hauses trinkt Kaffee */ member([_,_,_,pallmall,vogel],X), /* Die Person, die Pall Mall raucht, hält einen Vogel */ mittleres([_,_,milch,_,_],X), /* Der Mann, der im mittleren Haus wohnt, trinkt Milch */ member([gelb,_,_,dunhill,_],X), /* Der Besitzer des gelben Hauses raucht Dunhill */ erstes([_,norweger,_,_,_],X), /* Der Norweger wohnt im 1. Haus */ neben([_,_,_,marlboro,_],[_,_,_,_,katze],X), /* Der Marlboro-Raucher wohnt neben dem, der eine Katze hält */ neben([_,_,_,_,pferd],[_,_,_,dunhill,_],X), /* Der Mann, der ein Pferd hält, wohnt neben dem, der Dunhill raucht */ member([_,_,bier,winfield,_],X), /* Der Winfield-Raucher trinkt gern Bier */ neben([_,norweger,_,_,_],[blau,_,_,_,_],X), /* Der Norweger wohnt neben dem blauen Haus */ member([_,deutsche,_,rothmans,_],X), /* Der Deutsche raucht Rothmans */ neben([_,_,_,marlboro,_],[_,_,wasser,_,_],X), /* Der Marlboro-Raucher hat einen Nachbarn, der Wasser trinkt */ member([_,N,_,_,fisch],X), /* Der mit der Nationalität N hat einen Fisch */ printit(X). """) #print str exec str 
       
run().next() #find next solution of run 
       
[[gelb, norweger, wasser, dunhill, katze], [blau, daene, tee, marlboro,
pferd], [rot, brite, milch, pallmall, vogel], [gruen, deutsche, kaffee,
rothmans, fisch], [weiss, schwede, bier, winfield, hund]]
False
[[gelb, norweger, wasser, dunhill, katze], [blau, daene, tee, marlboro, pferd], [rot, brite, milch, pallmall, vogel], [gruen, deutsche, kaffee, rothmans, fisch], [weiss, schwede, bier, winfield, hund]]
False