我有两个dynamics
/ 2。
其中一个列表,让我们称之为D2已经在其中设置了值。例如:2和3,4和5。
我如何检查我的动态1还是。 D1具有D2内部的所有值,如果有,则返回true?
我尝试使用
member(E, D1(_,_)), member(E, D2(_, _)). So far but without much luck.
答案 0 :(得分:3)
就数据模型而言,这是非常狡猾的,无论你是怎么回事,如果它甚至效率都很低,如果它甚至可以使它工作。你定义一个arity 3事实要好得多,第一个arg是一个识别类型的原子。
那就是说,你可以做足够的内省来处理它。
dif(Q, P),
predicate_property(QR, dynamic),
predicate_property(PR, dynamic),
QR =.. [Q, _, _],
PR =.. [P, _, _].
这就是说,找到两个带有arity 2的谓词,其头部不同。理想情况下,您只需要用户定义的谓词。 SWI-Prolog不能这样做,但是GNU Prolog可以,你可以添加一些额外的限制:
predicate_property(QR, user),
predicate_property(PR, user),
这是我的解决方案:
matching(Q, P) :-
dif(Q, P), % different predicates, please
predicate_property(QR, dynamic), % both dynamic
predicate_property(PR, dynamic),
QR =.. [Q, Q1, Q2], % arity-2 predicates, please
PR =.. [P, P1, P2],
findall([Q1, Q2], clause(QR, true), Qs), % find all facts (:- true)
findall([P1, P2], clause(PR, true), Ps),
forall(member(PV, Ps), member(PV, Qs)), % ensure the fact sets are equal
forall(member(QV, Qs), member(QV, Ps)).
拜托,请请 不要这样做!