Prolog 序言:打印所有行星和卫星

Prolog 序言:打印所有行星和卫星,prolog,Prolog,我想得到比行星p更远的所有行星及其卫星O % 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

我想得到比行星
p
更远的所有行星及其卫星
O

% 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).
outer_orbit(P,O):-ae(O,X),ae(P,Y),X>Y.
首先,我试图找到所有比
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).
outer_orbit(P,O):-ae(O,X),ae(P,Y),X>Y.
现在我需要打印
O

我该怎么做

现在我需要打印
O

我该怎么做

这似乎是
findall/3

findall(X, orbits(X, P), Lm)
其中,
p
是行星,
Lm
是卫星列表

“打印”部分可以是简单的

write(Lm)
但通过这种方式,你也可以找到行星的列表

findall(X, orbits(X, sun), Lp)
如果你只想找到卫星,你也可以把
p
环绕
太阳

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提问

我如何将它与
外轨道(p,O)
结合起来,这样它就能显示出比
p
更远的所有行星及其卫星

我想有很多方法

如果您只想打印某些内容,并且希望使用
外部轨道/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)), _).

(希望您能找到更好的谓词名称)。

您好,谢谢。我将如何将它与外层轨道(P,O)结合起来,这样它就能显示出比P更远的所有行星及其卫星。@Chris-answer;希望这有帮助。嗨。我把它改成了外轨道(P,O):-ae(O,X),ae(P,Y),X>Y,findall(P1,(外轨道(O,P1),listPlanet(P1)),。但这仍然只能让我了解行星的最新信息。我也错过了他们的月亮。@Chris-我的例子不起作用?不管怎样,你到底想用一个在
findall/3
中调用自己的
外轨道/2
获得什么?它实际上像一个符咒一样工作。我想知道我是否可以在一个外层轨道(P,O)上同时完成这一切。我会将您的解决方案标记为完整。非常感谢你的努力。