Search code examples
prolog

How to get generalization of term. Prolog


For example - I have some terms:

moves(1, [1]).
moves(1, [2]).
moves(1, [3]).

How can I get next term?

moves(1, [1,2,3]).

% I have
    moves(1, [1]).
    moves(1, [2]).
    moves(1, [3]).

% I need to write some predicate which
    transform_moves :- 
        % ...
        % ...
        assert(moves(Pos, Arr)),

        % moves(1, [1,2,3]).

Solution

  • Program:

    :- dynamic moves/2.
    
    moves(1, [1]).
    moves(1, [2]).
    moves(1, [3]).
    
    transform_moves(Pos) :- 
        findall(Y, moves(Pos, [Y]), L), 
        retractall(moves(Pos, _)),
        assert(moves(Pos, L)).
    

    Call:

    ?- transform_moves(1).