Did you know ... Search Documentation:
Pack logtalk -- logtalk-3.77.0/examples/dynpred/SCRIPT.txt

This file is part of Logtalk https://logtalk.org/ SPDX-FileCopyrightText: 1998-2023 Paulo Moura <pmoura@logtalk.org> SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

% start by loading the example:

| ?- logtalk_load(dynpred(loader)). ...

% sending to descendant the message p/1, returns the definition in root:

| ?- descendant::p(Value).

Value = root yes

% asserting a local definition for p/1 in descendant overrides the inherited % definition:

| ?- descendant::(assertz(p(descendant)), p(Value)).

Value = descendant yes

% if we retract the local definition, again the definition inherited from root % will be used:

| ?- descendant::(retractall(p(_)), p(Value)).

Value = root yes

% class does not understand the message p1/1 (the predicate is declared only % for the class descendant instances):

| ?- class::p1(X).

error(existence_error(predicate_declaration, p1(_)), class::p1(_), user)

% the same message is valid for the class instances:

| ?- instance::p1(X).

X = class yes

% if we assert a clause for a new predicate, p2/1, in the class % (a side-effect being a dynamic declaration of the predicate):

| ?- class::assertz(p2(class)).

yes

% the new predicate, like p1/1, is not available for the class:

| ?- class::p2(Value).

error(existence_error(predicate_declaration, p2(_)), class::p2(_), user)

% but is available for the class instances, the same way as p1/1:

| ?- instance::p2(X).

X = class yes

% if we change our mind and abolish the new predicate:

| ?- class::abolish(p2/1). yes

| ?- instance::p2(_).

error(existence_error(predicate_declaration,p2/1), logtalk(_,_))) :-

% using a prototype, assert three new predicates (the method object_assert/0 % asserts the predicate public_predicate/0 from outside the prototype; the % method self_assert/0 asserts the predicate protected_predicate/0 in self; % the method this_assert/0 asserts the predicate private_predicate/0 in this):

| ?- prototype::(object_assert, self_assert, this_assert).

yes

% and check the resulting scope of each predicate:

| ?- prototype::dynamic_predicates.

public_predicate/0 - public protected_predicate/0 - protected private_predicate/0 - private yes