Karol Bielny

Karol Bielny inż. technik
informatycznych

Temat: [zagadka] Labirynt w prologu

Witam. Próbuje pobawić się troszkę zagadkami logicznymi wybrałem labirynt z książki Prolog programowanie, jednak za bardzo mi nie wychodzi...
Program:
s(a,b).
s(b,e).
s(b,c).
s(d,e).
s(c,d).
s(e,f).
s(g,e).
go(X,X,T).
go(X,Y,T):-
(s(X,Z); s(Z,X)),
\+ member(Z,T),
go(Z,Y,[Z|T]).
jestskarb(g).

http://yfrog.com/5ilabiryntzj labirynt

a teraz problemy:
1. go(a,X,[]), jestskarb(X).
są dwa rozwiązania X=g i X=g
w jaki sposób zastosować odcięcie, żeby to nie występowało.
2. jak zadeklarować po wpisaniu komendy idz prolog rozwiązywał labirynt
próbowałem: idz:-go(a,X,[]), jestskarb(X). ale nie dziala
3.jak zrobić aby pokazywało kolejne przejścia między komnatami?

zmienne rozumiem następująco:
X - pokój w którym się znajdujemy
Y - pokój do którego wchodzimy z pokoju X
T - odwiedzone pokoje
Z - inny możliwy pokój do wejścia z pokoju X

Proszę o odpowiedź czy dobrze rozumiem to? I czy ktoś ma jakieś pomysły co do pytań?
Z góry dziękuję

konto usunięte

Temat: [zagadka] Labirynt w prologu

Więc tak, jeśli uporządkujemy krawędzie grafu malejąco, to możemy znacznie uprościć logikę problemu:


s(a, b).
s(b, e).
s(b, c).
s(d, e).
s(c, d).
s(e, f).
% s(g, e). <- tutaj poprawka poniżej
s(e, g).

jestskarb(g).

path(A, A, []).
path(A, C, [B | L]) :-
s(A, B),
path(B, C, L).

go :-
jestskarb(X),
path(a, X, L),
write(L), nl,
fail.
go.


Natomiast dla grafu dwukierunkowego, np. tak:


s(a, b).
s(b, e).
s(b, c).
s(d, e).
s(c, d).
s(e, f).
s(g, e).

jestskarb(g).

path(A, B, L, L).
path(A, C, L0, L1) :-
(
s(A, B)
;
s(B, A)
),
\+ member(B, L0),
path(B, C, [B | L0], L1).

go :-
jestskarb(X),
path(a, X, [], L), % ścieżki częściowe
member(X, L), % warunek na pełne ścieżki
write(L), nl,
fail.
go.


Pozdrawiam

Następna dyskusja:

Zagadka z testu na IQ ... (...




Wyślij zaproszenie do