:- dynamic(ds1/1).
:- dynamic(ds2/1).
:- dynamic(ds3/1).
:- dynamic(ds4/1).
:- consult('plnxt.pl').
start :-
nxt_open,
thread_create(first_rotate,_,[detached(true)]).
clap :-
nxt_sound(Value,force),
Value > 30.
first_rotate :-
nxt_ultrasonic(A),
assert(ds1(A)),
nxt_rotate(300,85),
nxt_ultrasonic(B),
assert(ds2(B)),
nxt_rotate(300,85),
nxt_ultrasonic(C),
assert(ds3(C)),
nxt_rotate(300,85),
nxt_ultrasonic(D),
assert(ds4(D)),
nxt_rotate(300,85),
trigger_create(_,clap,second_rotate).
second_rotate :-
nxt_ultrasonic(A),
assert(ds1(A)),
nxt_rotate(300,85),
nxt_ultrasonic(B),
assert(ds2(B)),
nxt_rotate(300,85),
nxt_ultrasonic(C),
assert(ds3(C)),
nxt_rotate(300,85),
nxt_ultrasonic(D),
assert(ds4(D)),
nxt_rotate(300,85),
choose.
choose :- ds1(X),ds1(Y),X-Y>20,
trigger_create(_,check_distance,[stop]),nxt_go_cm(300,40).
choose :- ds2(X),ds2(Y),X-Y>20,
trigger_create(_,check_distance,[stop]),nxt_rotate(300,85),nxt_go_cm(300,40).
choose:- ds3(X),ds3(Y),X-Y>20,
trigger_create(_,check_distance,[stop]),nxt_rotate(300,170),nxt_go_cm(300,40).
choose:- ds4(X),ds4(Y),X-Y>20,
trigger_create(_,check_distance,[stop]),nxt_rotate(300,255),nxt_go_cm(300,40).
check_distance :-
nxt_ultrasonic(Distance,force),
Distance < 5.
stop :-
trigger_killall,
nxt_stop,
nxt_close.
Na początku robot wykonuje cztery obroty, każdy o 90 stopni i wykonuje pomiar odległości przy pomocy sensora ultrasonic. Z powodu nieprecyzyjnego obrotu w kodzie wpisujemy obrót o 85 stopni, co w praktyce pozwoliło osiągnąć obrót, który był zamierzony. Każdy pomiar przy pomocy predykatu assert zostaje dynamicznie dodany do bazy wiedzy naszego programu. Po dodaniu wszystkich pomiarów robot zatrzymuje się i oczekuje na klaśnięcie, po którym powtarza serię pomiarów. Kiedy wszystkie pomiary zostaną zakończone następuje porównanie odległości z pierwszego i drugiego obrotu. Z racji niedokładności pomiarów i niedokładności obrotów przyjmujemy pewien próg błędu, który pozwala uniknąć niewłaściwego zachowania robota. Kiedy robot stwierdzi, że różnica odległości między pomiarami jest wystarczająca wykonuje odpowiedni obrót i podjeżdża do miejsca, w którym wykrył zmiany.