如何在prolog中的另一个规则中使用规则

如何在prolog中的另一个规则中使用规则,prolog,Prolog,以下是我的事实: object('Human'). object('Machine'). object('Robot'). object('Hunter'). object('WallE'). action('Kill'). action('Run'). rel1('Hunter', 'Human'). rel1('Robot', 'Machine'). rel1('WallE', 'Robot'). rel2('Human', 'Run'). rel2('Machine', 'Run'

以下是我的事实:

object('Human').
object('Machine').
object('Robot').
object('Hunter').
object('WallE').

action('Kill').
action('Run').

rel1('Hunter', 'Human').
rel1('Robot', 'Machine').
rel1('WallE', 'Robot'). 

rel2('Human', 'Run').
rel2('Machine', 'Run').
rel2('Robot', 'Kill').
我试图找到实现给定操作的所有对象的列表。例如,如果我运行以下命令:

?-provides_action(’Run’, X).
结果如下:
X=[‘人类’、‘机器’、‘猎人’、‘机器人’、‘沃勒’。

结果如下:

X = ['WallE'].
我试过这个

provides_action2(X, L) :- findall(Y, (rel2(Y,X)),L).
provides_action3(X, L) :- provides_action2(X, L1), findall(Z, rel1(Z,L1), L2), append(L1,L2,L).
它没有给我正确的答案,我想使用第一个规则(L1)的结果,并在第二个findall扩展(Z,L1)中使用它,但它似乎没有这样做

谁能给我解释一下怎么了?
提前谢谢你

首先,必须使用
rel1/2
定义谓词
extends/2

extends(A, C) :- rel1(A, C).
extends(A, C) :- rel1(A, B), extends(B, C).
示例:

?- extends(X, 'Human').
X = 'Hunter' ;
false.

?- extends(X, 'Machine').
X = 'Robot' ;
X = 'WallE' ;
false.
之后,您可以使用此谓词定义
提供\u action/2
,如下所示:

provides_action(X, L) :-
   findall(Y, rel2(Y,X), L1),
   findall(C, (member(A, L1), extends(C, A)), L2),
   append(L1, L2, L).
请注意,迭代列表
L1
需要
成员(A,L1)

运行示例:

?- provides_action('Run', L).
L = ['Human', 'Machine', 'Hunter', 'Robot', 'WallE'].

例如,您没有
扩展/2
的定义。这可能是第一个代码块中写为
rel1/2
的子类关系?是的,对不起,您是对的,它应该是rel1。我编辑了代码。基本上,我尝试使用L1(fist provide_action2的结果)作为rel1(Z,L1),L2中的属性之一。但是它并没有像我希望的那样工作,有没有其他方法可以解决这个问题?你好,谢谢你的帮助,我刚刚编辑了原始问题,没有扩展规则。我在问题中犯了一个错误,应该是rel1。我的整个查询是这样的:提供操作3(X,L):-提供操作2(X,L1),findall(Z,rel1(Z,L1),L2),append(L1,L2,L)。我认为如果没有谓词
扩展/2
,你就无法解决这个问题,因为关系
rel1/2
'WallE'
直接相关。请参阅:
rel1('WallE','Robot')
rel1('Robot','Machine')
。嗯,我明白了,谢谢!
?- provides_action('Run', L).
L = ['Human', 'Machine', 'Hunter', 'Robot', 'WallE'].