This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/Logtalk/library/assignvars.lgt

115 lines
2.9 KiB
Plaintext
Raw Normal View History

/*
This file contains an adaptation to Logtalk of code for logical assignment
of Prolog terms developed by Nobukuni Kino. For more information, please
consult the URL http://www.kprolog.com/en/logical_assignment/
As a derivative work, this file is licensed under the Open Software License
version 2.1 (http://opensource.org/licenses/osl-2.1.php).
*/
:-op(100, xfx, '<=').
:-op(100, xfx, '=>').
:- category(assignvars).
:- info([
version is 1.0,
author is 'Nobukuni Kino and Paulo Moura',
date is 2005/1/7,
comment is 'Assignable variables (supporting logical, backtracable assignement of non-variable terms).']).
:- public(assignable/1).
:- mode(assignable(-assignvar), one).
:- info(assignable/1, [
comment is 'Makes Variable an assignable variable. Initial state will be empty.',
argnames is ['Variable'],
exceptions is [
'Variable is not a variable' - type_error(variable, 'Variable')]]).
:- public(assignable/2).
:- mode(assignable(-assignvar, @nonvar), one).
:- info(assignable/2, [
comment is 'Makes Variable an assignable variable and sets its initial state to Value.',
argnames is ['Variable', 'Value'],
exceptions is [
'Variable is not a variable' - type_error(variable, 'Variable'),
'Value is not instantiated' - instantiation_error]]).
:- public((<=)/2).
:- mode(<=(?assignvar, @nonvar), one).
:- info((<=)/2, [
comment is 'Sets the state of the assignable variable Variable to Value (initializing the variable if needed).',
argnames is ['Variable', 'Value'],
exceptions is [
'Value is not instantiated' - instantiation_error]]).
:- public((=>)/2).
:- mode(=>(+assignvar, ?nonvar), zero_or_one).
:- info((=>)/2, [
comment is 'Unifies Value with the current state of the assignable variable Variable.',
argnames is ['Variable', 'Value'],
exceptions is [
'Variable is not instantiated' - instantiation_error]]).
:-op(100, xfx, <=).
:-op(100, xfx, =>).
assignable(Assig) :-
nonvar(Assig),
self(Self),
sender(Sender),
throw(error(type_error(variable, Assig), Self::assignable(Assig), Sender)).
assignable([_| _]).
assignable(Assig, Init) :-
nonvar(Assig),
self(Self),
sender(Sender),
throw(error(type_error(variable, Assig), Self::assignable(Assig, Init), Sender)).
assignable(Assig, Init) :-
var(Init),
self(Self),
sender(Sender),
throw(error(instantiation_error, Self::assignable(Assig, Init), Sender)).
assignable([_, Init| _], Init).
Assig <= Value :-
var(Value),
self(Self),
sender(Sender),
throw(error(instantiation_error, Self::Assig <= Value, Sender)).
[_| Tail] <= Value :-
nonvar(Tail) ->
Tail <= Value
;
Tail = [Value| _].
Assig => Value :-
var(Assig),
self(Self),
sender(Sender),
throw(error(instantiation_error, Self::Assig => Value, Sender)).
[Current| Tail] => Value :-
nonvar(Tail) ->
Tail => Value
;
Current = Value.
:- end_category.