1:- module(canny_payloads, 2 [ payload/1, % +M:Payload/{ToArity, OfArity} 3 apply_to/1, % +M:To/Arity or +M:To/Arities 4 apply_to/2, % +Apply, +M:To 5 property_of/1, % +M:Of/Arity or +M:Of/Arities 6 property_of/2 % +Property, +M:Of 7 ]). 8 9:- meta_predicate 10 payload( ), 11 apply_to( ), 12 apply_to( , ), 13 property_of( ), 14 property_of( , ). 15 16:- use_module(arity).
42:- thread_local payload/2.
53payload(M:Payload/{ToArity, OfArity}) :-
54 apply_to(M:Payload/ToArity),
55 property_of(M:Payload/OfArity).
68visible(Prefix, Suffix, Args, M:Head) :- 69 atom(Suffix), 70 atomic_concat(Prefix, Suffix, Name), 71 Head =.. [Name|Args], 72 predicate_property(M:Head, visible). 73 74apply_to(M:To/Arity) :- 75 integer(Arity), 76 !, 77 atomic_concat(apply_to_, To, Name), 78 multifile(M:Name/Arity), 79 public(M:Name/Arity). 80apply_to(M:To/Arities) :- 81 arities(Arities, Arities_), 82 forall(member(Arity, Arities_), apply_to(M:To/Arity)).
93apply_to(Apply, _M:_To) :- var(Apply), !, fail. 94apply_to(reset, M:To) :- !, retractall(payload(M:To, _)). 95apply_to(push, M:To) :- 96 !, 97 of(M:To, [new, Payload], Head), 98 M:Head, 99 asserta(payload(M:To, Payload)). 100apply_to(peek(Payload), M:To) :- !, payload(M:To, Payload). 101apply_to(pop(Payload), M:To) :- !, retract(payload(M:To, Payload)). 102apply_to(Applies, M:To) :- 103 is_list(Applies), 104 !, 105 to(M:To, [_, _, _], Head), 106 functor(Head, Name, 3), 107 once(apply_to(peek(Payload0), M:To)), 108 foldl(M:Name, Applies, Payload0, Payload), 109 once(apply_to(pop(_Payload0), M:To)), 110 asserta(payload(M:To, Payload)). 111apply_to(Apply, M:To) :- to(M:To, [Apply], Head), M:Head. 112 113to(M:To, Args, Head) :- visible(apply_to_, To, Args, M:Head). 114 115property_of(M:Of/Arity) :- 116 integer(Arity), 117 !, 118 atomic_concat(property_of_, Of, Name), 119 multifile(M:Name/Arity), 120 public(M:Name/Arity). 121property_of(M:Of/Arities) :- 122 arities(Arities, Arities_), 123 forall(member(Arity, Arities_), property_of(M:Of/Arity)).
Property top/1 peeks semi-deterministically at the top-most payload for some given property.
133property_of(Property, _M:_Of) :- var(Property), !, fail. 134property_of(top(Property), M:Of) :- 135 !, 136 once(apply_to(peek(Payload), M:Of)), 137 of(M:Of, [Property, Payload], Head), 138 M:Head. 139property_of(Property, M:Of) :- of(M:Of, [Property], Head), M:Head. 140 141of(M:Of, Args, Head) :- visible(property_of_, Of, Args, M:Head)
Local Payloads
Apply and Property terms must be non-variable. The list below indicates the valid forms of Apply, indicating determinism. Note that only peek and pop perform non-deterministically for all thread-local payloads.
reset
is detpush
is semi-detpeek(Payload)
is non-detpop(Payload)
is non-det[Apply0|Applies]
is semi-detProperties as follows.
top(Property)
is semi-det for payloadThe first form top/1 peeks at the latest payload once. It behaves semi-deterministically for the top-most payload.
/