列表上的成对关系

时间:2014-04-08 23:29:59

标签: prolog terminology meta-predicate

如果列表元素的所有对对于给定关系都为真,则以下高阶谓词成功。这种关系是否有一个共同的或更好的,更具意图的名称?

我对这个名字的最初动机是在中,如果元素成对不同,通常会有一个约束all_different/1被描述为真。事实上,更倾向于说元素都是不同的,但我经常纠正(由Prolog程序员同意)使用pairwise不同。事实上,这种约束现在最自然地可以表示为pairwise(#\=, Zs)

pairwise(Rel_2, Xs) :-
   i_pairwise(Xs, Rel_2).

i_pairwise([], _).
i_pairwise([X|Xs], Rel_2) :-
   maplist(call(Rel_2,X),Xs),
   i_pairwise(Xs, Rel_2).

正如@aBathologist所观察到的,成对不是正确的词,因为它也可能对非反身Rel有意义。

此外,关系Rel不是完全关系,因为call(Rel, X, X)可能会失败,但pairwise(Rel, Xs)仍然可以成功。

我甚至对(a->a->Bool)->[a]->Bool抱怨。但是Hayoo found it:名称pairwise与逐点相反。

看着MO和数学:

2 个答案:

答案 0 :(得分:6)

我非常喜欢你的问题。我通过维基百科挖掘,试图找到一个合适的术语。我认为列表是一个集合,因为每个成员都是一个独特且可区分的元素,所以即使有两个相同原子的实例,也可能是不同的元素,它们的位置或其他。我认为你所描述的谓词将是[connex]二元关系(https://en.wikipedia.org/wiki/Total_relation):

  

X上的二元关系R称为connex,如果对于X中的所有a和b使得a≠b,a与b相关或b与a(或两者)相关

另一方面,如果关系也意味着反身,那么它将描述二元关系(与connex在同一页面上讨论)。

但是,我认为您的谓词pairwise/2实际上并不符合您提供的描述,或者(更有可能)我不太了解。

你说谓词应该成功&#34;如果列表元素的所有对都适用于给定的关系&#34;。但pairwise(>, [1,2,3])为false,而pairwise(<, [1,2,3])为true,而pairwise(>, [3,2,1])为true,pairwise(<, [3,2,1])为false。但是,从这些列表中的每对元素中,一个 大于另一个。


编辑:

以下是我误解的结果,结果与这个问题无关。

我提供了以下定义,认为它可能是@false描述的更准确的定义,但他指出它并没有定义我认为它做的关系。我保留它是为了让我们在评论中进行后续交流可以理解。

添加另一个反向检查列表的子句可以解决这个问题,但可能有其他关系无法通过反转来捕获吗?另外,是否有更有效的方法来实现真正的连接检查?

connex_over(Rel, Xs) :-
   i_connex_over(Xs, Rel), !.
connex_over(Rel, Xs) :-
   reverse(Xs, Sx),
   i_connex_over(Sx, Rel).

i_connex_over([], _).
i_connex_over([X|Xs], Rel) :-
   maplist(call(Rel,X),Xs),
   i_connex_over(Xs, Rel).

在@false指出我前面的错误之后,我写了以下定义。我相信它确实描述了S的元素的连接:

actual_connex_over(Rel, S) :-
   foreach( ( select(X, S, T), member(Y, T) ),
            ( call(Rel, X, Y) ; call(Rel, Y, X) )
          ).

答案 1 :(得分:4)

这样的高阶谓词显然非常有用(examplebreaks/1)。

与谓词foldl/n系列一样,在我看来,这个助记符名称应该更少关注于出现的代数结构,而是关注我们在这里找到的模式。例如,这种模式有点类似于手风琴,但这显然不是一个好名字。似乎有foldl/4scanl/4(或某种混合物)的概括,这种模式是特殊情况。