以下是我的事实:
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 = [’Human’, ’Machine’, ’Hunter’, ’Robot’, ’WallE’].
或
?-provides_action(’Kill’, 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 extends(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.
之后,您可以使用此谓词定义provides_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).
请注意,需要member(A, L1)
来迭代列表L1
。
运行示例:
?- provides_action('Run', L).
L = ['Human', 'Machine', 'Hunter', 'Robot', 'WallE'].