Lazy lists in Prolog?

后端 未结 6 1676
情深已故
情深已故 2020-11-28 11:45

Is it possible to have lazy lists in Prolog? Something like the following:

ones([1 | Y]) :- ones(Y).

Although this obviously doesn\'t work

6条回答
  •  南笙
    南笙 (楼主)
    2020-11-28 12:44

    % A simple generic solution using SWI-Prolog 
    
    % Returns a prefix of a lazy sequence
    
    prefix(Prefix,PrefixLength,LazySequenceName) :-
        apply(LazySequenceName,[LazySequence]),
        length(Prefix,PrefixLength),
        append(Prefix,_,LazySequence).
    
    % Lazy sequence of natural numbers
    
    nat(LazySequence) :- 
        nat(0,LazySequence).
    nat(Item,LazySequence) :-
        freeze(LazySequence,
          (LazySequence=[Item|Rest], Next is Item+1, nat(Next,Rest)) ).
    
    % Lazy sequence of Fibonacci numbers
    
    fib(LazySequence) :- 
        fib(1,0,LazySequence).
    fib(A,B,LazySequence) :-
        freeze(LazySequence,
           (LazySequence=[C|Rest], C is A+B, fib(B,C,Rest))).
    
    % Examples
    
    test :-
        prefix(N,10,nat), format('Ten first natural numbers: ~w~n',[N]),
        prefix(F,10,fib), format('Ten first Fibonacci numbers: ~w~n',[F]),
        fib(S), nth1(100,S,X), format('The hundredth Fibonacci number: ~w~n',[X]).
    

提交回复
热议问题