File: prime-node.pl

package info (click to toggle)
swi-prolog 9.0.4%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 82,408 kB
  • sloc: ansic: 387,503; perl: 359,326; cpp: 6,613; lisp: 6,247; java: 5,540; sh: 3,147; javascript: 2,668; python: 1,900; ruby: 1,594; yacc: 845; makefile: 428; xml: 317; sed: 12; sql: 6
file content (50 lines) | stat: -rw-r--r-- 1,240 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
:- module(prime_node, []).
:- use_module(library(redis_streams)).
:- use_module(library(redis)).
:- use_module(library(broadcast)).
:- use_module(library(main)).
:- use_module(library(statistics)).

:- use_module(common).

:- initialization(main,main).

main([Name]) :-
    set_prolog_flag(toplevel_goal, prolog),
    node(Name).

node(Name) :-
    make_group,
    catch_with_backtrace(
        listen_primes(Name),
        E,
        print_message(error, E)).

listen_primes(Consumer) :-
    thread_create(xlisten_group(test, primes, Consumer, [candidates],
                                [ block(0.1)
                                ]),
                  _, [alias(Consumer), detached(true)]).

:- listen(redis_consume(candidates, Data, Context),
          check_prime_string(Data, Context)).

check_prime_string(Data, Context) :-
    N = Data.get(candidate),
    T0= Data.get(time),
    !,
    call_time(is_prime(N), Dict, True),
    get_time(T1),
    T is T1-T0,
    redis(test, rpush(Data.drain,
                      p(N,True,Context.consumer,Dict.cpu,T) as prolog)).

is_prime(1) :- !.
is_prime(2) :- !.
is_prime(N) :-
    End is floor(sqrt(N)),
    (   between(2, End, I),
        N mod I =:= 0
    ->  !, fail
    ;   true
    ).