Prolog 如何在动态环境中比较元素

Prolog 如何在动态环境中比较元素,prolog,Prolog,我有两个dynamicsof/2 其中一个列表,我们称之为D2,其中包含设置值。例如:2和3,4和5 如何检查我的动态1是否正确。D1包含D2包含的所有值,如果包含,则返回true 我试着用 member(E, D1(_,_)), member(E, D2(_, _)). So far but without much luck. 就数据模型而言,这是相当令人讨厌的,无论你试图用它做什么,如果它能够工作的话,至少会是低效的。最好定义一个arity3事实,第一个参数是标识类型的原子 也就是说,你

我有两个
dynamics
of/2

其中一个列表,我们称之为D2,其中包含设置值。例如:2和3,4和5

如何检查我的动态1是否正确。D1包含D2包含的所有值,如果包含,则返回true

我试着用

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

就数据模型而言,这是相当令人讨厌的,无论你试图用它做什么,如果它能够工作的话,至少会是低效的。最好定义一个arity3事实,第一个参数是标识类型的原子

也就是说,你或许可以做足够的内省来处理它

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

请,请,请不要这样做

你所说的动态是什么意思?您是指在程序过程中断言或收回的动态数据库事实吗
D1(,)
不是一个列表,因此
成员(E,D1(,))没有任何意义。而且,
D1
D2
是变量,因为它们以大写字母开头。你打算让它们成为原子(
d1
d2
)?您不能有一个事实或一个谓词包含一个名称变量,例如
D1(…)
。我想我必须找到一种更好的方法来保存我想要的数据。但解决方案正在发挥作用。我的案子现在不关心表现。谢谢