用SWI Prolog解决爱因斯坦之谜

时间:2014-06-03 10:02:44

标签: prolog zebra-puzzle

所以我尝试使用我从这个网站上学到的教程来解决另一个爱因斯坦拼图。但是,我似乎没有得到答案。当我进行查询时,只有当我想知道哪对夫妇喜欢Violet时,它才会返回true。

    exist(A, (A,_,_,_,_,_,_,_)).
    exist(A, (_,A,_,_,_,_,_,_)).
    exist(A, (_,_,A,_,_,_,_,_)).
    exist(A, (_,_,_,A,_,_,_,_)).
    exist(A, (_,_,_,_,A,_,_,_)).
    exist(A, (_,_,_,_,_,A,_,_)).
    exist(A, (_,_,_,_,_,_,A,_)).
    exist(A, (_,_,_,_,_,_,_,A)).

    borrowed(B,C, (B,_,_,_,_,_,_,C)).
    borrowed(B,C, (_,B,_,_,_,_,_,C)).
    borrowed(B,C, (_,_,B,_,_,_,_,C)).
    borrowed(B,C, (_,_,_,B,_,_,_,C)).
    borrowed(B,C, (_,_,_,_,B,_,_,C)).
    borrowed(B,C, (_,_,_,_,_,B,_,C)).
    borrowed(B,C, (_,_,_,_,_,_,B,C)).

    solution(LikeViolet) :- Couples = (couple(_H1,_W1,_S1,_E1,_C1,_CL1,_B1,_BR1),                                                                                 couple(_H2,_W2,_S2,_E2,_C2,_CL2,_B2,_BR2), 
                couple(_H3,_W3,_S3,_E3,_C3,_CL3,_B3,_BR3), couple(_H4,_W4,_S4,_E4,_C4,_CL4,_B4,_BR4), 
                couple(_H5,_W5,_S5,_E5,_C5,_CL5,_B5,_BR5), couple(_H6,_W6,_S6,_E6,_C6,_CL6,_B6,_BR6), 
                couple(_H7,_W7,_S7,_E7,_C7,_CL7,_B7,_BR7), couple(_H8,_W8,_S8,_E8,_C8,_CL8,_B8,_BR8)),



    exist(couple(_,_Daniella,_Black,_ShopAsst,_,_,_,_),Couples),

    exist(couple(_,_,_,_,_Fiat,_Red,_Seadog,_),Couples),

    exist(couple(_Owen,_Victoria,_,_,_,_Brown,_,_),Couples),

    exist(couple(_Stan,_Hannah,_Horricks,_,_,_White,_,_),Couples),

    exist(couple(_,_Jenny,_Smith,_WarehouseManager,_Wartburg,_,_,_),Couples),

    borrowed(couple(_Alexander,_Monica,_,_,_,_,_,_),couple(_,_,_,_,_,_,_,Grandfather),Couples),

    exist(couple(_Mathew,_,_,_,_,_Pink,MulatkaGabriela,_),Couples),

    exist(couple(_Oto,_Irene,_,_Accountants,_,_,_,_),Couples),

    borrowed(couple(_,_,_,_,_Trabant,_,_,_),couple(_,_,_,_,_,_,_,_WeWereFive),Couples),

    exist(couple(_,_,_Cermaks,_TixCollect,_,_,_ShedStoat,_),Couples),

    borrowed( couple(_,_,_Kurils,_Doctors,_,_,_,_),couple(_,_,_,_,_,_,_,SlovackoJudge),Couples),

    exist(couple(_Paul,_,_,_,_,_Green,_,_),Couples),

    exist(couple(_,_Veronica,_Dvorak,_,_,_Blue,_,_),Couples),

    exist(couple(_Rick,_,_,_,_Ziguli,_,SlovackoJudge,_),Couples),

    borrowed( couple(_,_,_,_,_,_,_DameCamissar,_),couple(_,_,_,_,_,_,_,MulatkaGabriela),Couples),

    exist(couple(_,_,_,_,_Dacia,Violet,_,_),Couples),

    borrowed( couple(_,_,_,_Teachers,_,_,_,_),couple(_,_,_,_,_,_,_,_DameCommissar),Couples),

    exist(couple(_,_,_,_Agriculturalist,_Moskvic,_,_,_),Couples),

    exist(couple(_,Pamela,_,_,_Renault,_,Grandfather,_),Couples),

    borrowed(couple(_,Pamela,_,_,_,_,_,_),couple(_,_,_Zajac,_,_,_,_,_),Couples),

    borrowed(couple(_Robert,_,_,_,_,_Yellow,_,_),couple(_,_,_,_,_,_,_,ModernComedy),Couples),

    exist(couple(_,_,_Swain,_Shoppers,_,_,_,_),Couples),

    exist(couple(_,_,_,_,_Skoda,_,ModernComedy,_),Couples),

    exist(couple(_,_,LikeViolet,_,_,Violet,_,_),Couples).

1 个答案:

答案 0 :(得分:2)

您的代码中的一个问题是您正在使用变量,您应该使用原子来表示您从拼图提示中获得的信息位。例如,您有exist(couple(_,_,_,_,_Skoda,_,ModernComedy,_),Couples)而不是exist(couple(_,_,_,_,_skoda,_,modern_comedy,_),Couples)。因此,查询中的LikeViolet变量永远不会使用您正在寻找的答案进行实例化。