我需要实现一个谓词:
leastUpper(L1,L2,L)
当 L 是多重集 L1 和 L2 的最小上界时,它将被满足。这意味着对于 L 中的每个元素 X/N,X 是至少出现在 L1 和 L2 集合之一中的原子,N 是 L1 和 L2 中 X 的最大索引。如果 X 没有出现在一个集合中,则它在该集合中的索引为 0。
例如:
leastUpper([],[a/1,b/2,c/3],L) will be satisfied when L=[a/1,b/2,c/3]
or leastupper([a/2,b/3,c/2],[b/3,c/4,d/1],L) is satisfied if L=[a/2,b/3,c/4,d/1].
我目前的想法是:对于L1中的每个元素X/N,检查元素X/_是否存在于L2中。如果存在,比较它们的索引得到最大的索引Nx,然后在L中添加X/Nx。同时删除L1和L2中的对应元素。继续这个过程直到L1结束。对于 L1 和 L2 中的其余元素,它们只出现在一组 L1 或 L2 中,只需将它们添加到 L 中即可。原始想法可以用以下谓词来说明:
check(X/N,L2) :- member(X/_,L2),compare(...),append(X/Nx,L),delete(X/_,L1,L2).
我不知道我的想法是否正确以及如何在Prolog中实现它。欢迎任何想法并非常感谢!