Prolog逻辑难题失败

Prolog逻辑难题失败,prolog,zebra-puzzle,Prolog,Zebra Puzzle,我试图解决这里的逻辑难题: 以下是线索: 这些花是按以下顺序购买的:郁金香、办公室用花、紫色花、公园用玫瑰和朱莉娅买的白花 贝瑟尼喜欢花,但对花过敏,所以她永远不会在室内养花 星期三和星期五下雨了,因此,婚礼和生日聚会不得不搬到室内 艾米在瑞秋之后,但在克里斯汀之前买了花 瑞秋需要更多的东西来增加她的办公室,所以她选择了桃花来搭配她的窗帘 星期三,花店里仅有的紫色花朵是雏菊 粉红色的花是在康乃馨之后买的,但在百合花之前 生日花是在办公室花之后,但在婚礼花之前买的 我试图用以下代码

我试图解决这里的逻辑难题:

以下是线索:

  • 这些花是按以下顺序购买的:郁金香、办公室用花、紫色花、公园用玫瑰和朱莉娅买的白花

  • 贝瑟尼喜欢花,但对花过敏,所以她永远不会在室内养花

  • 星期三和星期五下雨了,因此,婚礼和生日聚会不得不搬到室内

  • 艾米在瑞秋之后,但在克里斯汀之前买了花

  • 瑞秋需要更多的东西来增加她的办公室,所以她选择了桃花来搭配她的窗帘

  • 星期三,花店里仅有的紫色花朵是雏菊

  • 粉红色的花是在康乃馨之后买的,但在百合花之前

  • 生日花是在办公室花之后,但在婚礼花之前买的

  • 我试图用以下代码在prolog中实现这一点:

    /*
    Use a nested predicate of flowers to store the solution
    
    flowers(
      f(Woman1,Flower1,Color1,Place1,Day1),
      f(Woman2,Flower2,Color2,Place2,Day2),
      f(Woman3,Flower3,Color3,Place3,Day3),
      f(Woman4,Flower4,Color4,Place4,Day4),
      f(Woman5,Flower5,Color5,Place5,Day5)
    ).
    */
    
    /* The flowers predicate contains a given flower X */
    has(X,F) :- F=flowers(X,_,_,_,_).
    has(X,F) :- F=flowers(_,X,_,_,_).
    has(X,F) :- F=flowers(_,_,X,_,_).
    has(X,F) :- F=flowers(_,_,_,X,_).
    has(X,F) :- F=flowers(_,_,_,_,X).
    
    /*Defines that X occurs on an earlier day than Y */
    before(X,Y,F) :- append(_,[X|Tail], F), append(_,[Y|_],Tail).
    
    
    solve(F) :-
      F = flowers(A,B,C,D,E),
    /*clue 1 */
      A = f(_,tulips,yellow,_,monday),
      B = f(_,_,_,office,tuesday),
      C = f(_,_,purple,_,wednesday),
      D = f(_,roses,_,park,thursday),
      E = f(julia,_,white,_,friday),
    /* Clue 2 --> Look @ clue 3, Bethany can only have flowers in backyard or park */
      has(f(bethany,_,_,backyard,_),F), 
      has(f(bethany,_,_,_,park,_),F),
    /* Clue #4, Amy before Kristen, Rachel before Amy */
      before(f(amy,_,_,_,_),f(kristen,_,_,_,_),F),
      before(f(rachel,_,_,_,_),f(amy,_,_,_,_),F),
    /* Clue #5 */
      has(f(rachel,_,peach,office,_),F),
    /* Clue #6 */
      has(f(_,daisies,purple,_,wednesday),F),
    /* Clue #7, pink before lillies, carnations before pink */
      before(f(_,_,pink,_,_),f(_,lilies,_,_,_),F),
      before(f(_,carnations,_,_,_),f(_,_,pink,_,_),F),
    /* Clue #8 */
      before(f(_,_,_,birthday,_),f(_,_,_,wedding,_),F),
      before(f(_,_,_,office,_),f(_,_,_,birthday,_),F).
    
    这似乎不起作用。我相信问题要么是我的代码在定义一朵花时比另一朵花先出现,但我不确定这是否是问题所在,以及如何补救。此外,我认为说贝瑟尼为后院或公园(不是婚礼、生日或办公室)买花也有问题

    以下是谜题的答案:

    朱莉娅:百合花,白色,婚礼,星期五

    艾米:雏菊,紫色,生日,星期三

    贝瑟尼:郁金香,黄色,后院,星期一

    康乃馨,桃子,办公室,星期二

    克里斯汀:玫瑰,粉红,公园,星期四


    您在/3之前
    谓词试图处理
    花(A、B、C、D、E)
    就好像它是一个列表一样。它总是失败。您需要将其定义为
    [A、B、C、D、E]
    ,它才能工作

    如果您将
    flowers(A,B,C,D,E)
    更改为
    [A,B,C,D,E]
    ,这样您就可以使用内置谓词
    member/2
    而不是
    has/2

    因此,首先我做了以下工作:

    writeln(X) :- write(X), nl.
    
    writelist([]).
    writelist([H|T]) :- writeln(H), writelist(T).
    
    /*Defines that X occurs on an earlier day than Y */
    before(X,Y,F) :- append(F0, F1, F), member(X, F0), member(Y, F1).
    
    你还想说贝瑟尼在后院和公园里。它需要是一个
    关系

    这是我的
    solve/1
    版本:

    solve(F) :-
    /*clue 1 */
        F = [
            f(_,tulips,yellow,_,monday),
            f(_,_,_,office,tuesday),
            f(_,_,purple,_,wednesday),
            f(_,roses,_,park,thursday),
            f(julia,_,white,_,friday)
        ],
    /* Clue 2 --> Look @ clue 3, Bethany can only have flowers in backyard or park */
        (member(f(bethany,_,_,backyard,_),F);
            member(f(bethany,_,_,_,park,_),F)),
    /* Clue #4, Amy before Kristen, Rachel before Amy */
        before(f(amy,_,_,_,_),f(kristen,_,_,_,_),F),
        before(f(rachel,_,_,_,_),f(amy,_,_,_,_),F),
    /* Clue #5 */
        member(f(rachel,_,peach,office,_),F),
    /* Clue #6 */
        member(f(_,daisies,purple,_,wednesday),F),
    /* Clue #7, pink before lillies, carnations before pink */
        before(f(_,_,pink,_,_),f(_,lilies,_,_,_),F),
        before(f(_,carnations,_,_,_),f(_,_,pink,_,_),F),
    /* Clue #8 */
        before(f(_,_,_,birthday,_),f(_,_,_,wedding,_),F),
        before(f(_,_,_,office,_),f(_,_,_,birthday,_),F),
        true.
    
    现在当我查询
    ?-solve(F),writelist(F)。
    我得到:

    f(bethany, tulips, yellow, backyard, monday) f(rachel, carnations, peach, office, tuesday) f(amy, daisies, purple, birthday, wednesday) f(kristen, roses, pink, park, thursday) f(julia, lilies, white, wedding, friday) Yes. f(贝瑟尼,郁金香,黄色,后院,星期一) f(瑞秋、康乃馨、桃子、办公室,星期二) f(艾米,黛西,紫色,生日,星期三) f(克里斯汀、玫瑰、粉红、公园、星期四) f(朱莉娅、百合花、白色、婚礼、星期五) 对
    你是说
    has(f(bethany,,,,,,,,,,,后院,,),f)
    has(f(bethany,,,,,,,,,,,),f)
    必须成功——两者都要成功。不要把你的问题简单化,尤其是已经解决的问题。(我不明白为什么Stackoverflow在最后一次编辑时没有“回滚”操作。这有什么意义?这可能是一个UI故障,应该说“回滚到”,而不是隐含的“回滚到此”)@DavidTonhofer你是对的,文本令人困惑。它的意思是“回滚到此”。
    有(X,F):-函子(F,flowers,5),arg(u,F,X)。
    。如果你用
    F=flowers(A,B,C,D,E)开始你的
    solve/1
    ,你甚至可以省略身体中的第一个目标,就像你实际做的那样。然后,在(X,Y,F)之前,
    :-arg(I,F,X),arg(J,F,Y),I