2013-05-04 12 views
18

Mam ten fragment kodu:Prolog: klauzule nie są razem w pliku źródłowym

% Family tree 
female(pen). 
male(tom). 
male(bob). 
female(liz). 
female(pat). 
female(ann). 
male(jim). 

parent(pam, bob). 
parent(tom, bob). 
parent(tom, liz). 
parent(bob, ann). 
parent(bob, pat). 
parent(pat, jim). 

otrzymuję ten błąd:

Warning: Clauses of female/1 are not together in source-file 
Warning: Clauses of male/1 are not together in source-file 

Jaki jest cel tego błędu?
Mam na myśli, plik kompiluje się i działa dobrze i jestem świadomy znaczenia błędu. Ale dlaczego?
Czy to tylko wymóg wymuszania najlepszych praktyk?

Jestem bardzo nowy w programowaniu logicznym.
Dzięki!

+0

Dla tych, którzy nie wiedzą, jak to naprawić: Grupuj relacje (w tym przypadku "męskie" i "żeńskie") według nazwy relacji. –

Odpowiedz

12

Prawidłowo, to ostrzeżenie wymuszające stosowanie sprawdzonych metod, czyli umieszczanie wszystkich powiązanych klauzul w pliku źródłowym. Poza tym bliskość klauzul między sobą w pliku źródłowym nie ma znaczenia, o ile ich względna kolejność się nie zmienia.

+0

Czy istnieje sposób, aby to wyłączyć? Czasami po prostu nie mogę napisać kodu w ten sposób. – intelis

+1

@intelis Istnieje sposób poinformowania Prolog, że zamierzasz rozpowszechniać klauzule ([link do odpowiedzi wyjaśniającej, jak to zrobić] (http://stackoverflow.com/q/2482101/335858)). – dasblinkenlight

+0

dzięki, ale to nie tylko klauzule. Dostaję masę różnych ostrzeżeń, takich jak zmienne Singletona itp. – intelis

5

Ostrzeżenie zachęca do stosowania najlepszych praktyk i pomaga wykryć literówki. Oto literówka przykład:

small(ant). 
small(fly). 
small(molecule). 

smell(sweet). 
smell(pungent). 
small(floral). 

Błędem jest trudne do wykrycia, ale na szczęście kompilator ostrzega:

Warning: /tmp/test.pl:7: 
Clauses of small/1 are not together in the source-file 

z ostrzeżeniem i błędu linii, można znaleźć i szybciej poprawić literówkę.

ISO Prolog dostarcza dyrektywę discontiguous/1, aby uciszyć to ostrzeżenie dla określonych predykatów. Zobacz rozdział 7.4.2.3 specyfikacji. Jest używany w następujący sposób:

:- discontiguous small/1. 
Powiązane problemy