当Y mod X = 0时,存在部分有序的集合关系le(X,Y)
(所以有le(1,5), le(5,70), le(7,14)
等。)
我必须做出谓词
max(X)
是X最大元素
greatest(X)
是X最大的元素
定义max(X)
很简单,因为
max(X) :- \+ le(X,A), le(B,X)
。 (没有任何更大的元素,X在集合中)
但greatest(X)
怎么样?
答案 0 :(得分:1)
对于least upper bound(LUB),您需要两套。首先是参数集S,你要求的是LUB,然后是你要搜索LUB的部分顺序T.所以输入如下:
然后代码与最大值非常相似。只需使用范围限制公式,即搜索偏序。这适用于有限偏序的普通Prolog。
这是你的可分性示例:
?- [user].
ls(X,Y) :-
Y mod X =:= 0.
bound(M,Y) :-
\+ (member(X,M),
\+ls(X,Y)).
lub(S,T,Y) :-
member(Y,T), bound(S,Y),
\+ (member(Z,T), bound(S,Z),
\+ls(Y,Z)).
^D
以下是一些示例运行:
?- lub([3,2],[1,2,3,4,5,6,7,8,9,10],Y).
Y = 6 ;
false.
?- lub([5,3],[1,2,3,4,5,6,7,8,9,10],Y).
false.
?- lub([5,3],[1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20],Y).
Y = 15 ;
false.
上面非常通用的算法不是效率最高的,它的顺序是m ^ 2 * n ^ 2,其中n是S的大小,m是T的大小。对于无限的偏序,你需要发明一些东西与CLP(X)。