:-object belief.

  backtracking_example(Field) :-
    member_attr(Field, Value),
    format('backtracking: list member = ~w~n', [Value]),
    fail.
  backtracking_example(_).


  new_attr(Field) :-
    set_field(Field, []).

  show_attr(Field) :-
    get_field(Field, Value),
    format('~w = ~w~n', [Field, Value]).

  add_attr(Field, Value) :-
    get_field(Field, OldList),
    add_attr(OldList, Value, NewList),
    set_field(Field, NewList).

  %% add + check duplicates:
  add_attr([], V, [V]) :-
    !.
  add_attr([H|T], H, [H|T]) :-
    !. % bestaat al, skip.
  add_attr([H|T1], V, [H|T2]) :-
    add_attr(T1, V, T2).


  lookup_attr(Field, Value) :-
    get_field(Field, List),
    lookup_next_attr(List, Value).

  lookup_next_attr([], _) :-
    !, fail.
  lookup_next_attr([H|_], H) :-
    !.
  lookup_next_attr([_|T], V) :-
    lookup_next_attr(T, V).

  member_attr(Field, Value) :-
    get_field(Field, List),
    member(Value, List).

  delete_attr(Field, Value) :-
    get_field(Field, OldList),
    delete_attr_from_list(OldList, NewList, Value),
    set_field(Field, NewList).

  delete_attr_from_list([], [], _) :-
    !.  % not found, fail | error ?
  delete_attr_from_list([H|T], T, H) :-
    !.
  delete_attr_from_list([H|T1], [H|T2], V) :-
    delete_attr_from_list(T1, T2, V).

:- end_object belief.
