| Autor |
Wiadomość |
pachelbe ~user
Dołączył: 01 Lis 2009 Posty: 3
|
|
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 ? 
|
|
| Powrót do góry |
|
|
TPJ #Moderator

Dołączył: 06 Kwi 2005 Posty: 484 Skąd: Gliwice Pomógł: 13
|
|
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 |
|
|
pachelbe ~user
Dołączył: 01 Lis 2009 Posty: 3
|
|
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 
|
|
| Powrót do góry |
|
|
TPJ #Moderator

Dołączył: 06 Kwi 2005 Posty: 484 Skąd: Gliwice Pomógł: 13
|
|
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?
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 |
|
|
pachelbe ~user
Dołączył: 01 Lis 2009 Posty: 3
|
|
fajny motyw
dzieki za pomoc 
|
|
| Powrót do góry |
|
|
|
|
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
|
MapaPowered by phpBB © 2001, 2005 phpBB Group
|
|