fal*_*lse 11 terminology prolog meta-predicate
如果给定关系的列表元素的所有对都为真,则以下高阶谓词成功.对于这种关系,是否存在共同的或更好的,更具意图的名称?
我对这个名字的最初动机是,在clpfd中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).
Run Code Online (Sandbox Code Playgroud)
正如@aBathologist所观察到的,成对不是正确的词,因为它也可能对非反身有意义Rel
.
此外,关系Rel
不是一个完整的关系,因为call(Rel, X, X)
可能会失败,但pairwise(Rel, Xs)
仍然可以成功.
我甚至还在鼓励(a->a->Bool)->[a]->Bool
.但是Hayoo 发现它:名字pairwise
与逐点相反.
看MO和数学:
我非常喜欢你的问题.我通过维基百科挖掘,试图找到一个合适的术语.我认为列表是一个集合,在某种意义上,每个成员都是一个独特且可区分的元素,所以即使有两个相同原子的实例,也可能是不同的元素,它们的位置或其他.我认为你所描述的谓词将是[connex]二元关系(https://en.wikipedia.org/wiki/Total_relation):
X上的二元关系R称为connex,如果对于X中的所有a和b使得a≠b,a与b相关或b与a(或两者)相关
另一方面,如果关系也意味着反身,那么它将描述一个完整的二元关系(在与connex相同的页面上进行讨论).
但是,我认为你的谓词pairwise/2
实际上并不适合你给出的描述,或者(更有可能)我不太明白.
你说谓词应该成功"如果列表的所有元素对于给定的关系都是真的".但这pairwise(>, [1,2,3])
是假的,但是是pairwise(<, [1,2,3])
真的,虽然pairwise(>, [3,2,1])
是真的,但却pairwise(<, [3,2,1])
是假的.但出每对从这些列表元素中的,一个是大于另一个.
编辑:
以下是我误解的结果,结果与问题无关.
我提出了以下定义,认为它可能是@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).
Run Code Online (Sandbox Code Playgroud)
在@false指出我前面的错误后,我写了以下定义.我相信它确实描述了S元素的连接:
actual_connex_over(Rel, S) :-
foreach( ( select(X, S, T), member(Y, T) ),
( call(Rel, X, Y) ; call(Rel, Y, X) )
).
Run Code Online (Sandbox Code Playgroud)