Prolog:打印所有行星和卫星

时间:2016-12-25 09:31:03

标签: prolog

我希望所有行星的卫星O远离行星P

% planets
orbits(mercury, sun).
orbits(venus, sun).
orbits(earth, sun).
orbits(mars, sun).
orbits(jupiter, sun).
orbits(saturn, sun).
orbits(uranus, sun).
orbits(neptune, sun).
ae(mercury, 0.39).
ae(venus, 0.72).
ae(earth, 1).
ae(mars, 1.52).
ae(jupiter, 5.20).
ae(saturn, 9.54).
ae(uranus, 19.22).
ae(neptune, 30.06).
% moons
orbits(moon, earth).
orbits(deimos, mars).
orbits(phobos, mars).
orbits(ganymede, jupiter).
orbits(callisto, jupiter).
orbits(io, jupiter).
orbits(europa, jupiter).
orbits(titan, saturn).
orbits(enceladus, saturn).
orbits(titania, uranus).
orbits(oberon, uranus).
orbits(umbriel, uranus).
orbits(ariel, uranus).
orbits(miranda, uranus).
orbits(triton, neptune).

首先,我试图获得比P

更远的所有行星
outer_orbit(P,O):-ae(O,X),ae(P,Y),X>Y.

现在我需要打印O

中的所有月亮

我该怎么做?

1 个答案:

答案 0 :(得分:2)

  

现在我需要打印O

中的所有月亮      

我该怎么做?

这似乎是findall/3

的作品
findall(X, orbits(X, P), Lm)

其中P是行星,Lm是卫星列表。

" print"部分可以是一个简单的

write(Lm)

但是通过这种方式你也可以找到行星列表,

findall(X, orbits(X, sun), Lp)

如果您只想找到卫星,您还可以强制执行P

周围的sun轨道
findall(X, (orbits(P, sun), orbits(X, P)), Lm)

或以下条款

allMoons(P, Lm) :-
  orbits(P, sun),
  findall(X, orbits(X, P), Lm).

或者,通过打印,

printAllMoons(P) :-
  orbits(P, sun),
  findall(X, orbits(X, P), Lm),
  write(Lm).

---编辑---

OP问

  

我如何将其与outer_orbit(P,O)结合使用,以便显示距离P更远的所有行星及其卫星。

我想有很多方法。

如果您只想打印某些内容并且想要使用outer_orbit/2,则可以使用以下示例

printPlanetAndMoons(P1) :-
  write('- planet '), write(P1), nl,
  findall(X, orbits(X, P1), Lm),
  (     Lm \== []
     -> (write('   -- with moons '), write(Lm), nl)
     ;  true ).

printAllPlanetsAndMoonsMoreDistantThanAPlanet(P0) :-
  write('planets and moons more distant than '), write(P0), write(':'), nl,
  findall(P1, (outer_orbit(P0, P1), printPlanetAndMoons(P1)), _).

(希望你能为谓词找到更好的名字)。