Prolog - 部分有序集

时间:2018-02-19 19:08:15

标签: prolog

当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)怎么样?

1 个答案:

答案 0 :(得分:1)

对于least upper bound(LUB),您需要两套。首先是参数集S,你要求的是LUB,然后是你要搜索LUB的部分顺序T.所以输入如下:

  • 部分订单
  • S集合,S子集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)。