【问题标题】:prolog printing out same answer for different parametersprolog 为不同的参数打印出相同的答案
【发布时间】:2017-05-08 06:42:13
【问题描述】:

我正在编写一个解决逻辑难题的 Prolog 程序。当试图打印出答案时,它给了我所有答案的相同答案。逻辑谜题的答案是:

  • genevieve 买了一个 4 号的 manzarita
  • lucia 买了 7 号 Graffetz
  • 肖娜买了 5 码的威利福德
  • vanessa 买了 6 号 Abbot Hill

我的代码如下:

customer(genevieve).
customer(lucia).
customer(shawna).
customer(vanessa).

shoesize(4).
shoesize(5).
shoesize(6).
shoesize(7).

manufactorer(abbothill).
manufactorer(manzarita).
manufactorer(graffetz).
manufactorer(williford).

solve :-
   shoesize(GenevieveShoesize),
   shoesize(LuciaShoesize),
   shoesize(ShawnaShoesize),
   shoesize(VanessaShoesize),
   all_different([GenevieveShoesize, LuciaShoesize, ShawnaShoesize,     VanessaShoesize]),
   manufactorer(AbbotHillManufactorer),
   manufactorer(ManzaritaManufactorer),
   manufactorer(GraffetzManufactorer),
   manufactorer(WillifordManufactorer),

   all_different([AbbotHillManufactorer, ManzaritaManufactorer, 
    GraffetzManufactorer, WillifordManufactorer]),
   List = [ [genevieve,GenevieveShoesize,AbbotHillManufactorer],
      [lucia,LuciaShoesize,ManzaritaManufactorer],
      [shawna,ShawnaShoesize,GraffetzManufactorer],
      [vanessa,VanessaShoesize,WillifordManufactorer]],

   \+(member([_,5,manzarita],List)),
   \+(member([_,6,manzarita],List)),
   \+(member([lucia,5,_],List)),
   \+(member([lucia,6,_],List)),
   \+(member([genevieve,_,abbothill],List)),
   \+(member([shawna,_,graffetz],List)),
   (member([vanessa,_,abbothill],List)),

   tell(genevieve,GenevieveShoesize,GeneieveManufactorer),
   tell(lucia,LuciaShoesize,LuciaManufactorer),
   tell(shawna,ShawnaShoesize,ShawnaManufactorer),
   tell(vanessa,VanessaShoesize,VanessaManufactorer).

all_different([H | T]) :- member(H,T), !, fail.
all_different([_ | T]) :- all_different(T).
all_different([]).


tell(X,Y,Z) :-
   customer(X),
   shoesize(Y),
   manufactorer(Z),
   write(X), write(' got their shoes from'),
   write(Y), write(' and is a size '), write(Z), nl.

当我去 SWI 并要求它:

-告诉(X,Y,Z) 它输出: X 等于吉纳维芙, Y 等于 4, Z 等于方丈山。

如果我指定变量之一,例如 告诉(凡妮莎,Y,Z) 它会打印出来:vanessa买了一个4号的方丈山;保持 Y 和 Z 的值不变。

【问题讨论】:

    标签: prolog zebra-puzzle


    【解决方案1】:

    逻辑难题的答案是:-genevieve 买了 4 码的 manzarita -lucia 买了 7 码 Graffetz -shawna 买了 5 码 williford -vanessa 买了 6 码 Abbot Hill"

    如果这些是谜题的唯一答案,那么您的逻辑是错误的,您的代码会生成比这更多的答案。

    以下是根据您的程序的一些解决方案:

    X = genevieve,
    Y = 4,
    Z = abbothill ;
    genevieve got their shoes from4 and is a size manzarita
    X = genevieve,
    Y = 4,
    Z = manzarita ;
    genevieve got their shoes from4 and is a size graffetz
    X = genevieve,
    Y = 4,
    Z = graffetz ;
    genevieve got their shoes from4 and is a size williford
    X = genevieve,
    Y = 4,
    Z = williford ;
    genevieve got their shoes from5 and is a size abbothill
    X = genevieve,
    Y = 5,
    Z = abbothill ;
    genevieve got their shoes from5 and is a size manzarita
    X = genevieve,
    Y = 5,
    Z = manzarita ;
    genevieve got their shoes from5 and is a size graffetz
    X = genevieve,
    Y = 5,
    Z = graffetz ;
    genevieve got their shoes from5 and is a size williford
    X = genevieve,
    Y = 5,
    Z = williford ;
    

    如果您想找到所有独特的解决方案,您可以运行:setof((X,Y,Z), tell(X,Y,Z), Y).

    根据您的程序生成 64 个有效的不同解决方案。

    如果我指定变量之一,例如tell(vanessa,Y,Z),它将打印出:vanessa买了一个4号的方丈山;保持 Y 和 Z 的值不变。

    它不会使YZ 的值相同,它只是意味着Y = 4, Z = abbothillX = vanessa第一个 解决方案,您可以生成下一个解决方案; 你会看到YZ 并不总是相同的,例如:

    ?- tell(vanessa,Y,Z).
    vanessa got their shoes from4 and is a size abbothill
    Y = 4,
    Z = abbothill ;
    vanessa got their shoes from4 and is a size manzarita
    Y = 4,
    Z = manzarita ;
    vanessa got their shoes from4 and is a size graffetz
    Y = 4,
    Z = graffetz ;
    vanessa got their shoes from4 and is a size williford
    Y = 4,
    Z = williford ;
    vanessa got their shoes from5 and is a size abbothill
    Y = 5,
    Z = abbothill ;
    

    编辑:如果你的目标是解决这个逻辑难题:

    有 4 位客户:Genevieve、Lucia、Shawna、Vanessa

    有 4 种鞋码:4、5、6、7

    有 4 家鞋厂:Abbott Hill、Manzarita、Graffetz、 威利福德

    1. 在 Manzarita 鞋和 Lucia 的那双鞋中,一个是 7 码,另一个是 4 码。

    2. Genevieve 的这双鞋比 Abbott Hill 的鞋小 2 码。

    3. Vanessa 的那双比 Genevieve 的大 2 码。

    4. Graffetz 的鞋比 Shawna 的鞋稍大。

    对于每位顾客,请显示他们的姓名、鞋码和鞋码 制造商的格式与此类似:

    乔买了 13 号耐克。

    Tom 买了 12 码的 Reebok。

    你可以这样使用:

    customer(genevieve).
    customer(lucia).
    customer(shawna).
    customer(vanessa).
    
    shoesize(4).
    shoesize(5).
    shoesize(6).
    shoesize(7).
    
    manufactorer(abbothill).
    manufactorer(manzarita).
    manufactorer(graffetz).
    manufactorer(williford).
    
    four_or_seven(L):-
        member((lucia, 7, _), L),
        member((_, 4, manzarita), L).
    four_or_seven(L):-
        member((lucia, 4, _), L),
        member((_, 7, manzarita), L).
    
    less_than_abbott_hill(L):-
        member((genevieve, S0, _), L),
        member((_, S1, abbothill), L),
        S0 is S1-2.
    
    vanessa_larger_than_genevieve(L):-
        member((vanessa, S0, _), L),
        member((genevieve, S1, _), L),
        S0 is S1+2.
    
    graffetz_larger_than_shawna(L):-
        member((shawna, S0, _), L),
        member((_, S1, graffetz), L),
        S1 > S0.
    
    solve:-
        shoesize(S0), manufactorer(M0),
        shoesize(S1), manufactorer(M1),
        shoesize(S2), manufactorer(M2),
        shoesize(S3), manufactorer(M3),
        all_different([M0,M1,M2,M3]),
        L = [(genevieve, S0, M0), (lucia, S1, M1), (shawna, S2, M2), (vanessa, S3, M3)],
        four_or_seven(L),
        less_than_abbott_hill(L),
        vanessa_larger_than_genevieve(L),
        graffetz_larger_than_shawna(L),
        print(L).
    
    all_different([H | T]) :- member(H,T), !, fail.
    all_different([_ | T]) :- all_different(T).
    all_different([]).
    
    print([(C, S, M)|T]):-
        format("~p bhought a size ~p ~p~n", [C,S,M]),
        print(T).
    
    print([]).
    

    请注意,这个谜题有多种解决方案,示例运行:

    ?- [puzzle].
    true.
    
    ?- solve.
    genevieve bhought a size 4 manzarita
    lucia bhought a size 7 graffetz
    shawna bhought a size 4 williford
    vanessa bhought a size 6 abbothill
    true ;
    genevieve bhought a size 4 manzarita
    lucia bhought a size 7 graffetz
    shawna bhought a size 5 williford
    vanessa bhought a size 6 abbothill
    true
    

    【讨论】:

    • 谢谢!这是我第一次在 prolog 中编程,我的逻辑哪里出错了?我觉得这很令人困惑
    • 今晚有时间我会看看它,但你应该继续努力,我想你会在练习后得到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多