我希望所有行星和的卫星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
我该怎么做?
答案 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)), _).
(希望你能为谓词找到更好的名字)。