succ  prec  indice 

Esempio "Raggiungibilita'/Collegamento"

In questo esempio ispirato ad un  grafo di nove nodi, il predicato ricorsivo "raggiunge/2" (can_reach) viene appreso rispetto al predicato "collegato_a/2" (linked_to) espresso in forma estensionale.
 

*
foil_predicates([ can_reach/2, linked_to/2]).
foil_cwa(true).                   
foil_use_negations(false).        % Don't use negations of foil_predicates
foil_det_lit_bound(0).            % Don't add any determinate literals
                                  % In general, this is a depth limit on
                                  %   the search for determinate literals

% Definitions of background predicates
can_reach(0,1).
can_reach(0,2).
can_reach(0,3).
can_reach(0,4).
can_reach(0,5).
can_reach(0,6).
can_reach(0,8).
can_reach(1,2).
can_reach(3,2).
can_reach(3,4).
can_reach(3,5).
can_reach(3,6).
can_reach(3,8).
can_reach(4,5).
can_reach(4,6).
can_reach(4,8).
can_reach(6,8).
can_reach(7,6).
can_reach(7,8).

linked_to(0,1).
linked_to(0,3).
linked_to(1,2).
linked_to(3,2).
linked_to(3,4).
linked_to(4,5).
linked_to(4,6).
linked_to(6,8).
linked_to(7,6).
linked_to(7,8).




======================================================================
=== SWI-PROLOG
======================================================================

Load an example data file: [filename]
Start Foil               : foil(Predicate/Arity)
Start Foil measure time  : foil_time(Predicate/Arity)
/apl/misc/prolog/foil.pl compiled, 0.01 sec, 23,260 bytes.

Yes
2 ?- [foil_1].

foil_1 compiled, 0.00 sec, 2,396 bytes.

Yes
3 ?- foil(can_reach/2).

Uncovered positives:
[can_reach(0, 1), can_reach(0, 2), can_reach(0, 3), can_reach(0, 4), can_reach(0, 5), can_reach(0, 6), can_reach(0, 8), can_reach(1, 2), can_reach(3, 2), can_reach(3, 4), can_reach(3, 5), can_reach(3, 6), can_reach(3, 8), can_reach(4, 5), can_reach(4, 6), can_reach(4, 8), can_reach(6, 8), can_reach(7, 6), can_reach(7, 8)]

Adding a clause ...

Specializing current clause: 
can_reach(A, B).

Covered negatives:
[can_reach(0, 0), can_reach(0, 7), can_reach(1, 0), can_reach(1, 1), can_reach(1, 3), can_reach(1, 4), can_reach(1, 5), can_reach(1, 6), can_reach(1, 7), can_reach(1, 8), can_reach(2, 0), can_reach(2, 1), can_reach(2, 2), can_reach(2, 3), can_reach(2, 4), can_reach(2, 5), can_reach(2, 6), can_reach(2, 7), can_reach(2, 8), can_reach(3, 0), can_reach(3, 1), can_reach(3, 3), can_reach(3, 7), can_reach(4, 0), can_reach(4, 1), can_reach(4, 2), can_reach(4, 3), can_reach(4, 4), can_reach(4, 7), can_reach(5, 0), can_reach(5, 1), can_reach(5, 2), can_reach(5, 3), can_reach(5, 4), can_reach(5, 5), can_reach(5, 6), can_reach(5, 7), can_reach(5, 8), can_reach(6, 0), can_reach(6, 1), can_reach(6, 2), can_reach(6, 3), can_reach(6, 4), can_reach(6, 5), can_reach(6, 6), can_reach(6, 7), can_reach(7, 0), can_reach(7, 1), can_reach(7, 2), can_reach(7, 3), can_reach(7, 4), can_reach(7, 5), can_reach(7, 7), can_reach(8, 0), can_reach(8, 1), can_reach(8, 2), can_reach(8, 3), can_reach(8, 4), can_reach(8, 5), can_reach(8, 6), can_reach(8, 7), can_reach(8, 8)]

Covered positives:
[can_reach(0, 1), can_reach(0, 2), can_reach(0, 3), can_reach(0, 4), can_reach(0, 5), can_reach(0, 6), can_reach(0, 8), can_reach(1, 2), can_reach(3, 2), can_reach(3, 4), can_reach(3, 5), can_reach(3, 6), can_reach(3, 8), can_reach(4, 5), can_reach(4, 6), can_reach(4, 8), can_reach(6, 8), can_reach(7, 6), can_reach(7, 8)]

Gain: -9.40499  Clause: can_reach(A, B) :- linked_to(C, A)
Gain: 14.6299   Clause: can_reach(A, B) :- linked_to(A, C)
Gain: 10.531    Clause: can_reach(A, B) :- linked_to(C, B)
Gain: -7.52399  Clause: can_reach(A, B) :- linked_to(B, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(B, A)
Gain: 20.9192   Clause: can_reach(A, B) :- linked_to(A, B)
Gain: 0 Clause: can_reach(A, B) :- linked_to(B, B)

Clause found:
can_reach(A, B) :-
        linked_to(A, B).

Uncovered positives:
[can_reach(0, 2), can_reach(0, 4), can_reach(0, 5), can_reach(0, 6), can_reach(0, 8), can_reach(3, 5), can_reach(3, 6), can_reach(3, 8), can_reach(4, 8)]

Adding a clause ...

Specializing current clause: 
can_reach(A, B).

Covered negatives:
[can_reach(0, 0), can_reach(0, 7), can_reach(1, 0), can_reach(1, 1), can_reach(1, 3), can_reach(1, 4), can_reach(1, 5), can_reach(1, 6), can_reach(1, 7), can_reach(1, 8), can_reach(2, 0), can_reach(2, 1), can_reach(2, 2), can_reach(2, 3), can_reach(2, 4), can_reach(2, 5), can_reach(2, 6), can_reach(2, 7), can_reach(2, 8), can_reach(3, 0), can_reach(3, 1), can_reach(3, 3), can_reach(3, 7), can_reach(4, 0), can_reach(4, 1), can_reach(4, 2), can_reach(4, 3), can_reach(4, 4), can_reach(4, 7), can_reach(5, 0), can_reach(5, 1), can_reach(5, 2), can_reach(5, 3), can_reach(5, 4), can_reach(5, 5), can_reach(5, 6), can_reach(5, 7), can_reach(5, 8), can_reach(6, 0), can_reach(6, 1), can_reach(6, 2), can_reach(6, 3), can_reach(6, 4), can_reach(6, 5), can_reach(6, 6), can_reach(6, 7), can_reach(7, 0), can_reach(7, 1), can_reach(7, 2), can_reach(7, 3), can_reach(7, 4), can_reach(7, 5), can_reach(7, 7), can_reach(8, 0), can_reach(8, 1), can_reach(8, 2), can_reach(8, 3), can_reach(8, 4), can_reach(8, 5), can_reach(8, 6), can_reach(8, 7), can_reach(8, 8)]

Covered positives:
[can_reach(0, 2), can_reach(0, 4), can_reach(0, 5), can_reach(0, 6), can_reach(0, 8), can_reach(3, 5), can_reach(3, 6), can_reach(3, 8), can_reach(4, 8)]

Gain: -5.58087  Clause: can_reach(A, B) :- linked_to(C, A)
Gain: 8.8184    Clause: can_reach(A, B) :- linked_to(A, C)
Gain: 6.09533   Clause: can_reach(A, B) :- linked_to(C, B)
Gain: -4.18565  Clause: can_reach(A, B) :- linked_to(B, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(B, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, B)
Gain: 0 Clause: can_reach(A, B) :- linked_to(B, B)
Specializing current clause: 
can_reach(A, B) :-
        linked_to(A, C).

Covered negatives:
[can_reach(0, 0), can_reach(0, 7), can_reach(1, 0), can_reach(1, 1), can_reach(1, 3), can_reach(1, 4), can_reach(1, 5), can_reach(1, 6), can_reach(1, 7), can_reach(1, 8), can_reach(3, 0), can_reach(3, 1), can_reach(3, 3), can_reach(3, 7), can_reach(4, 0), can_reach(4, 1), can_reach(4, 2), can_reach(4, 3), can_reach(4, 4), can_reach(4, 7), can_reach(6, 0), can_reach(6, 1), can_reach(6, 2), can_reach(6, 3), can_reach(6, 4), can_reach(6, 5), can_reach(6, 6), can_reach(6, 7), can_reach(7, 0), can_reach(7, 1), can_reach(7, 2), can_reach(7, 3), can_reach(7, 4), can_reach(7, 5), can_reach(7, 7)]

Covered positives:
[can_reach(0, 2), can_reach(0, 4), can_reach(0, 5), can_reach(0, 6), can_reach(0, 8), can_reach(3, 5), can_reach(3, 6), can_reach(3, 8), can_reach(4, 8)]

Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), can_reach(C, A)
Gain: 18        Clause: can_reach(A, B) :- linked_to(A, C), can_reach(C, B)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), can_reach(A, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), can_reach(B, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), can_reach(C, C)
Gain: -2.80176  Clause: can_reach(A, B) :- linked_to(A, C), linked_to(D, A)
Gain: 1.52932   Clause: can_reach(A, B) :- linked_to(A, C), linked_to(A, D)
Gain: 6.63269   Clause: can_reach(A, B) :- linked_to(A, C), linked_to(D, B)
Gain: -4.27879  Clause: can_reach(A, B) :- linked_to(A, C), linked_to(B, D)
Gain: -3.58694  Clause: can_reach(A, B) :- linked_to(A, C), linked_to(D, C)
Gain: 7.6025    Clause: can_reach(A, B) :- linked_to(A, C), linked_to(C, D)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(A, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(B, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(C, A)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(A, B)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(B, B)
Gain: 10        Clause: can_reach(A, B) :- linked_to(A, C), linked_to(C, B)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(A, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(B, C)
Gain: 0 Clause: can_reach(A, B) :- linked_to(A, C), linked_to(C, C)

Clause found:
can_reach(A, B) :-
        linked_to(A, C),
        can_reach(C, B).

Found definition:
can_reach(A, B) :-
        linked_to(A, C),
        can_reach(C, B).
can_reach(A, B) :-
        linked_to(A, B).


Yes
4 ?-
*

 succ  prec  indice