% % An almost portable implementation of logial assignment. % Distributed from http://www.kprolog.com/en/logical_assignment/ % % Copyright(C) 2003-2005 Nobukuni Kino, KLS Research, Inc. % kino@kprolog.com % % Licensed under the Open Software License version 2.1 % http://opensource.org/licenses/osl-2.1.php % % 12/31/2004 First distribution % 1/2/2005 assignable/2 is corrected(issued by Paulo Moura) % :-module assignable. % :-public assignable/1,assignable/2. % :-public (<=)/2,(<+)/2,(=>)/2. :-op(700,xfy, '<='). :-op(700,xfy, '<+'). :-op(700,xfy, '=>'). assignable([_|_]). assignable(Assig,Init):- Tail=[Init|_], Assig=[_|Tail]. Assig<=Value :- poke_assig(Assig,Value). poke_assig([X|Y],Value):- nonvar(Y),!, poke_assig(Y,Value). poke_assig([_,Value|_],Value). % (<+)/2 cannot have logical implementation. Assig<+Value :- Assig<=Value. Assig=>Value :- peek_assig(Assig,Value). peek_assig([X|Y],Value):- nonvar(Y),!, peek_assig(Y,Value). peek_assig([Value|_],Value).