GNU Prolog 之谜,类似于爱因斯坦之谜 [英] Riddle with GNU Prolog, similar to Einstein Riddle

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

问题描述

我是一个完全的编程初学者,必须使用 GNU Prolog 在 Prolog 中创建和解决一个谜语,类似于爱因斯坦谜语,尽管不太复杂.我一直在尝试为以下中包含的项目创建一个谜语.

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 之谜,类似于爱因斯坦之谜的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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