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(…)
。我想我必须找到一种更好的方法来保存我想要的数据。但解决方案正在发挥作用。我的案子现在不关心表现。谢谢