Fibo Kowalsky
Fibo Kowalsky

Reputation: 1248

Predicate to detect if Prolog Term was specified (became more specific)

Is it possible to get a predicate with already built-in ones (in swi-prolog) such that:

Wanted_Pred(X, a) %false
Wanted_Pred(b, a) %false
Wanted_Pred(X, Y) %true
Wanted_Pred(X, X) %true
Wanted_Pred(X, [Y|Z]) %false
Wanted_Pred([A|B], [X,Y|Z]) %false
Wanted_Pred([A,C|B], [X,Y|Z]) %true

e.g. succeeds iff both arguments represent each others free variable renaming, note that copy_term doesn't do it as it unifies arguments in the end:

copy_term(X, a) %true 
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true

Upvotes: 1

Views: 186

Answers (2)

CapelliC
CapelliC

Reputation: 60004

subsumes_term/2 perfectly fits your requirements, just swap the arguments:

?- subsumes_term(a,X).
false.

?- subsumes_term(a,b).
false.

?- subsumes_term(Y,X).
true.

?- subsumes_term(X,X).
true.

?- subsumes_term([Y|Z],X).
false.

?- subsumes_term([X,Y|Z],[A|B]).
false.

?- subsumes_term([X,Y|Z],[A,C|B]).
true.

I've seen a fairly recent thread on SWI-Prolog mailing list on the efficient implementation of (=@=)/2, that I think it's related (actually, it also satisfies your requirements): putting it to good use should be the best option available.

edit correcting the link to mailing list. Recent switch of list' hosting to google groups made the archive unavailable...

You can find the thread for instance in archived discussions, searching for the author, Kuniaki Mukai

Upvotes: 5

Fibo Kowalsky
Fibo Kowalsky

Reputation: 1248

Here is the predicated I am searching implemented by me but I WANT TO FIND OUT IF THIS KIND OF PREDICATE IS BUILT_IN OR SIMILAR ONE IN SWI-PROLOG.

true_copy(X, Y) :-
    (X == Y, !);
    (var(X), var(Y), !);
    ((var(X); var(Y)) -> !, fail);
    (atom(X), atom(Y) -> !, fail).

true_copy([X | L1], [Y | L2]) :-
    !,
    true_copy(X, Y),
    true_copy(L1, L2).

true_copy(Term1, Term2) :-
    Term1 =.. L1,
    Term2 =.. L2,
    true_copy(L1, L2).  

Upvotes: 0

Related Questions