또 다른 방법. 우리는 (각 자신에 유용)이 높은 순서 술어,
select_with(_, _, [], []).
select_with(P, X, [Y|Ys], Ys) :- call(P, X, Y), !.
select_with(P, X, [Y|Ys], [Y|Ks]) :-
select_with(P, X, Ys, Ks).
foldl(_,[],Vn,Vn).
foldl(P,[X|Xs],V0,Vn) :-
call(P,X,V0,V1),
foldl_(P,Xs,V1,Vn).
자신을 제공하는 경우 각 구성원 하나 개의 목록이 다른에서 동일한 요소가있는 경우 우리는 쉽게 사용 (사실 술어를 정의 할 수 있습니다 ==/2
) : 우리가 들어오는 인수가 varsets 있는지 확인하는 경우
members_equal(A, B :-
foldl(select_with(==), A, B, []).
이 술어
은 명시된 목적을 위해 전문 수 있습니다. 다음은 내가 그 방향을 마련 할 수있었습니다 최고입니다 (하지만 꽤 몇 가지 추론 먹는다) :
이
is_varset([]).
is_varset([V|Vs]) :-
var(V),
maplist(\==(V), Vs),
is_varset(Vs).
(적어도 SWI 프롤로그에, sort/2
사용하여 위보다 적은 추론을 걸립니다 아마도 이것은 정렬이 C로 이루어지기 때문입니다. 또한이 대답은 여전히 term_vars/2
접근법의 우아함에 접근하지 않습니다. 예를 들어 "의미 상 승강"의 힘입니다.
두 인수 중 하나라도 고유 변수 목록이 아닌 경우 조건부가 실패해야합니까? –
그냥 기다리고, 아마도 더 많은 다른 대답이 있습니다. – false
나는 다른 것을 시도하고 있었지만'As '와'Bs'가 실제로 자유 변수의 집합인지 확인해야했습니다. 내 대답은'term_variables/2'의 두 번째 인수와 통합해야한다는 사실에 의해 보장됩니다. –