[Prolog] wypisanie par bez powtórzeń

 
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Języki akademickie: LISP, Prolog, Fortran, Ada
Autor Wiadomość
pachelbe
~user




Dołączył: 01 Lis 2009
Posty: 3


PostWysłany: 01-11-09 19:53 Zacytuj zaznaczone Odpowiedz z cytatem

Witam, mam mały problem przy zadaniu z Prologa, mianowicie mam wypisać pary (chłopca i dziewczyny podane w bazie ) ale tak, zeby nie wystepowaly powtorzenia typu:
Janek-Mariola
...
Mariola- Janek

Ktoś mi coś podpowie ? Rolling Eyes
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
TPJ
#Moderator




Dołączył: 06 Kwi 2005
Posty: 484
Skąd: Gliwice
Pomógł: 13

PostWysłany: 02-11-09 10:17 Zacytuj zaznaczone Odpowiedz z cytatem

Problem ten można rozwiązać na wiele różnych sposobów. Najprościej byłoby wymyślić taki model zadania, w którym tego typu symetrie w ogóle nie mogłyby się pojawiać. Na przykład: mamy zbiór chłopców C oraz dziewczynek D i dobieramy elementy tych zbiorów w pary (c,d). Zbiór odpowiedzi (par) jest wtedy iloczynem kartezjańskim zbiorów C i D, względnie (jeśli wprowadzimy dodatkowe kryteria doboru w pary) podzbiorem tego iloczynu kartezjańskiego.

Pytanie tylko, jaka jest treść zadania?

_________________
Masz dość WP, Interii, Onetów? Zajrzyj na netbird.pl.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
pachelbe
~user




Dołączył: 01 Lis 2009
Posty: 3


PostWysłany: 02-11-09 11:32 Zacytuj zaznaczone Odpowiedz z cytatem

tresc zadania w sumie jak napisalem: Wypisz wszystkie pary osób (koniecznie bez powtórzeń), które występują w relacjach określonych w zadaniu poprzednim." .. przykladowa relacja z 1 zadania: sa_rodzenstwem(Osoba1,Osoba2) - skutkuje, gdy Osoba1 oraz Osoba2 mają tę samą matkę i ojca... zrobilem tak:

// fakt dziecko(A,B) - A jest dzieckiem B
sa_rodzenstwem(A,B) :- dziecko(A,X),dziecko(A,Y),dziecko(B,X),dziecko(B,Y), X\=Y,A\=B.
wypisz_rodzenstwo:-sa_rodzenstwem(X,Y),write(X-Y),nl,fail.


No i z takiego trzeba wypisac pary bez powtorze, prowadzacy cos podpowiedzial ze mozna użyć cut-fail ale nie za bardzo wiem jak Confused
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
TPJ
#Moderator




Dołączył: 06 Kwi 2005
Posty: 484
Skąd: Gliwice
Pomógł: 13

PostWysłany: 02-11-09 20:21 Zacytuj zaznaczone Odpowiedz z cytatem

Może i da się to zrobić za pomocą cut-fail, ale nie pamiętam już tych Prologowych sztuczek. Ja sobie z takimi problemami radzę wprowadzając jakąś relację uporządkowania do zbioru i żądając, aby w odpowiedzi elementy z tego zbioru były rosnące lub malejące. W tym przypadku byłoby to tak:

Kod:

osoba(andrzej,m,1).
osoba(marek,m,2).
osoba(jacek,m,3).
osoba(ania,k,4).
osoba(alicja,k,5).


Jest to kluczowy element kodu: baza danych z wszystkimi osobami. Każdej osobie przyporządkowany jest unikalny identyfikator. Właśnie ten identyfikator przyda się później przy eliminowaniu symetrii. Dodatkowo określona jest płeć osoby (m - mężczyzna, k - kobieta).

Kolejne dane dotyczą relacji rodzicielstwa:

Kod:

rodzic(andrzej,marek).
rodzic(andrzej,jacek).
rodzic(andrzej,alicja).
rodzic(ania,marek).
rodzic(ania,jacek).
rodzic(ania,alicja).


Teraz możemy już korzystać z Prologa, żeby opisać relację bycia dzieckiem:

Kod:

dziecko( Dziecko, Rodzic ) :- rodzic( Rodzic, Dziecko ).


Rodzeństwo możemy natomiast opisać następująco:

Kod:

rodzenstwo( DzieckoA, DzieckoB ) :-
  osoba(Ojciec, m, _),
  rodzic(Ojciec, DzieckoA),
  rodzic(Ojciec, DzieckoB),
  osoba(Matka, k, _),
  rodzic(Matka, DzieckoA),
  rodzic(Matka, DzieckoB),
  osoba(DzieckoA,_,IdA),        # (1)
  osoba(DzieckoB,_,IdB),        # (2)
  IdA > IdB.                    # (3)


Bardzo podobnie do Twojego kodu - no ale jak ma być inaczej, skoro to to samo? Wink

Zwróć jednak uwagę na linie (1)-(3), bo to jest właśnie eliminacja symetrii. Ustaliwszy już dokładne dane dzieci, pobieramy z bazy danych ich identyfikatory (IdA, IdB), a następnie żądamy, żeby identyfikator DzieckaA był większy od identyfikatora DzieckaB. Proste, prawda? Dzięki temu prawdziwym zdaniem będzie rodzenstwo( jacek, marek ), a zdanie rodzenstwo( marek, jacek ) już nie będzie prawdziwe.

_________________
Masz dość WP, Interii, Onetów? Zajrzyj na netbird.pl.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
pachelbe
~user




Dołączył: 01 Lis 2009
Posty: 3


PostWysłany: 03-11-09 19:44 Zacytuj zaznaczone Odpowiedz z cytatem

fajny motyw Smile

dzieki za pomoc Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Języki akademickie: LISP, Prolog, Fortran, Ada Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

Mapa
Powered by phpBB © 2001, 2005 phpBB Group

 Polecane strony