如何比较动态

时间:2015-12-08 23:49:57

标签: prolog

我有两个dynamics / 2。

其中一个列表,让我们称之为D2已经在其中设置了值。例如:2和3,4和5。

我如何检查我的动态1还是。 D1具有D2内部的所有值,如果有,则返回true?

我尝试使用

member(E, D1(_,_)), member(E, D2(_, _)). So far but without much luck.

1 个答案:

答案 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)).

拜托,请 不要这样做!