具体化memberd_t/3的更好定义

问题描述 投票:0回答:1
“Indexing diff/2”的

第 7 节讨论了一般具体化,并为具体化列表成员给出了以下定义:

memberd_t(X, Es, T) :-
   l_memberd_t(Es, X, T).

l_memberd_t([], _, false).
l_memberd_t([E|Es], X, T) :-
   if_( X = E
   , T = true
   , l_memberd_t(Es, X, T) ).

它看起来确实有点太复杂了,我无法理解。毕竟原来的

memberd/2
并没有使用
if_/3
。 只有后续的优化才做到这一点。原始版本可在第 4 节中找到:

memberd(X, [E|Es]) :-
   (  X = E
   ;  dif(X, E),
      memberd(X, Es)
   ).

然后使用

if_/3
逐步优化版本。

我的尝试就这么多。 有没有更好的方法来定义

memberd_t/3
,不直接依赖于
if_/3
,并且更好地揭示我们这里有两种选择的事实?承诺:将使用我 10k 以上的代表。

prolog meta-predicate logical-purity
1个回答
0
投票

看起来很简单,除非“更好”的定义有微妙之处:

memberd2_t(X, Es, T) :-
    memberd2_t_(T, X, Es).
    
memberd2_t_(false, X, Es) :-
    maplist(dif(X), Es).
memberd2_t_(true, X, Es) :-
    member(X, Es).

swi-prolog 的结果:

?- length(Es, 3), memberd2_t(X, Es, T).
Es = [_A, _B, _C],
T = false,
dif(X, _A),
dif(X, _C),
dif(X, _B) ;
Es = [X, _, _],
T = true ;
Es = [_, X, _],
T = true ;
Es = [_, _, X],
T = true.
© www.soinside.com 2019 - 2024. All rights reserved.