GNU Prolog中的Riddle,类似于Einstein Riddle [英] Riddle with GNU Prolog, similar to Einstein Riddle

查看:105
本文介绍了GNU Prolog中的Riddle,类似于Einstein Riddle的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是编程的完整初学者,必须使用GNU Prolog在Prolog中创建和解决一个谜题,尽管它不那么复杂,但与Einstein谜题类似.我一直在尝试为以下中包含的项目创建一个谜语.

I am a complete beginner to programming and have to create and solve a riddle in Prolog using GNU Prolog, similar to the Einstein riddle, albeit less sophisticated. I have been trying to create a riddle for the items contained within the following table.

到目前为止,我的代码看起来像这样,但是我真的不完全理解我在这里做错了什么.我可以在GNU Prolog中编译代码,但不能解决难题:

My code so far look like this, but I really do not entirely understand what I am doing wrong or right here. I can compile the code in GNU Prolog, but it will not solve the riddle:

middle(M,[_,M,_]).
right(A,B,[[_|A]|B]).
left(A,B,[A|[B|_]]).
run:-
   X = [_,_,_],
   middle([_,brown,_],X),   /* the brown guinea pig lives in the middle of the cage */
   member([brown,carrots,_],X), /* the brown guinea pig loves to eat carrots */
   member([_,salad,giggles],X), /* the salad eating guinea pig giggles */
   right([_,salad,_],[brown,_,_],X),    /* the salad eating guinea pig sits to the right of the brown guinea pig */
   left([black,_,_],[_,_,squeaks],X),   /* the black guinea pig sleeps to the left of the squeaking guinea pig */
   member([black,_,grumbles],X),    /* the black guinea pig grumbles */
   member([grey,_,giggles],X),  /* the grey guinea pig giggles*/
   write(X),nl, /* write out all fur colors */
   write('the '),write(N),write(' guinea pig loves to eat cucumbers'),nl. /* answer to the question */

我将非常感谢您的帮助,因为我对这些事情不太熟悉,但必须为我参加的课程找出解决方案.任何提示将大有帮助.谢谢!

I would greatly appreciate any help as I am quite unfamiliar with these things but have to figure out a solution for a class I am taking. Any tips would be of great help. Thanks!

推荐答案

请小心,并保持一致.将每件事物放置在自己的位置.而且,您已经弄乱了一些需要修复的列表代码.所以,你去.

Just be careful, and keep things uniform. Keep each thing in its own place. And, you had mangled some list codes which needed fixing. So, here you go.

middle(M, [_,M,_]).
right(A,B,X) :- left(B,A,X).
left(A,B,X) :- append(_, [A,B | _], X).

run :-
   X = [_,_,_],
   middle([_       ,brown,_      ],X),   /* the brown guinea pig - middle of the cage */
   member([_       ,brown,carrots],X),   /* the brown guinea pig loves to eat carrots */
   member([giggles ,_    ,salad  ],X),   /* the salad-eating guinea pig giggles */
   right( [_       ,_    ,salad  ],      /* the salad-eating guinea pig sits */
          [_       ,brown,_      ],X),   /*    to the right of the brown guinea pig */
   left(  [_       ,black,_      ],      /* the black guinea pig sleeps to the left */
          [squeaks ,_    ,_      ],X),   /*    of the squeaking guinea pig */
   member([grumbles,black,_      ],X),   /* the black guinea pig grumbles */
   member([giggles ,grey ,_      ],X),   /* the grey guinea pig giggles */
   member([_       ,EC ,cucumbers],X),   /* a guinea pig that loves to eat cucumbers */

   X = [[_,A,_],[_,B,_],[_,C,_]], write([A,B,C]), nl, /* write out all fur colors */
   write('the '), write(EC),
   write(' guinea pig loves to eat cucumbers'), nl. /* the answer to the question */

但是,有人可能会争辩说,人类程序员在模具中为三个属性设置了三个位置,从而注入了太多的理解(即有些被骗了).他知道豚鼠在这个宇宙中.

But, some might argue, the human programmer has infused too much of his understanding here (i.e. cheated somewhat) by making the mold with three places for the three attributes that he knows guinea pigs have in this universe.

但这不是必需的.这是我们让计算机" 通过使用可扩展记录"

This is not necessary though. Here's how we let the "computer" to figure that out all by itself, using kind of "extensible records" :

attr(A, [N-V | R]):- memberchk( N-X, A), X = V, attr(A, R).
attr(_, []).

color(A, B):- attr( A, [color-B]).

pigs( Pigs):-
  length( Pigs,N), 
  N rem 2 =:= 1, Middle is N div 2,    /* there _is_ a middle - list length is odd */
  nth0( Middle,Pigs,P1), attr( P1, [color-brown]), 
  member( P2, Pigs),     attr( P2, [color-brown, eats-carrots]),
  member( P3, Pigs),     attr( P3, [eats-salad, sound-giggles]),
  right( P4,P4b,Pigs),   attr( P4, [eats-salad]),   attr( P4b, [color-brown]),
  left(  P5,P5b,Pigs),   attr( P5, [color-black]),  attr( P5b, [sound-squeaks]),
  member( P6, Pigs),     attr( P6, [color-black, sound-grumbles]),
  member( P7, Pigs),     attr( P7, [color-grey,  sound-giggles]),
  member( P8, Pigs),     attr( P8, [eats-cucumbers, color-EatsCucumbers]),
  length( Furs, N),      maplist( color, Pigs, Furs),
  writeln( Furs),        writeln( EatsCucumbers),  nl, !.

测试:

14 ?- time(( pigs(_P), maplist(writeln,_P), ! )).
[black,brown,grey]
black

[color-black, sound-grumbles, eats-cucumbers|_G1484]
[color-brown, eats-carrots,   sound-squeaks |_G1424]
[eats-salad,  sound-giggles,  color-grey    |_G1463]
/* % 287 inferences, 0.000 CPU in 0.030 seconds (0% CPU, Infinite Lips) */
true.

这篇关于GNU Prolog中的Riddle,类似于Einstein Riddle的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆