2010-10-13 4 views

Odpowiedz

0

Been poważnie dawno pisałem żadnej prolog, ale pewnie bym robić rzeczy trochę inaczej. Coś takiego, choć nie mogę tego przetestować w tym momencie.

print_increasing_numbers(From, To):- From > To, !, write('ERROR: From > To'). 

print_increasing_numbers(To, To):- !, write(To). 

print_increasing_numbers(From, To):- write(From), 
            nl, 
            Next is From + 1, 
            print_increasing_numbers(Next, To). 

Kluczową różnicą jest tu ! lub pocięte operacja, która przestaje wycofywania. Jeśli go nie uwzględnisz, otrzymasz rozwiązanie z pierwszym klauzulą, gdy X ma 10, ale jeśli poprosisz o drugie rozwiązanie, będzie ono również cofało się i pasowało do drugiej klauzuli. To spowodowałoby znacznie większą listę liczb, niż chcesz.

+0

Mmmmmm, że próbowałem i nie działa, drukuje " ERROR:>/2: Argumenty są niewystarczająco instancja wyjątek: (7) print_increasing_numbers (_G272 + 1, _G305)? Pełzanie " – dasen

+0

-1 za nie testowanie kodu i brak oceny" X + 1 " – Kaarel

+0

@Kaarel: Dzięki. Zapomniałem o tym aspekcie zachowania prologa. Po wprowadzeniu tej poprawki i pamiętaniu o zmianie nazwy X i Y na Od i Do, działało dobrze. – torak

9

Twój kod jest bardzo blisko pracy. Problem polega na tym, że nie można ponownie użyć X, gdy zostanie utworzony, nie można go zmienić (więcej szczegółów można znaleźć w artykule here). Użyj nową zmienną w następujący sposób: (!)

print_numbers(10) :- write(10), !. 
print_numbers(X) :- write(X), nl, Next is X + 1, print_numbers(Next). 

Dodanie cięcie do końca zapobiegnie tłumacza z pytaniem, czy chcesz zobaczyć więcej wyników.

?- print_numbers(1). 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

Yes 
?- 
+0

Po prostu chcę dodać do tego. Możesz użyć ponownie zmiennej, jeśli została cofnięta. Więc jeśli masz niezainicjowaną wartość i zainicjujesz ją, aby uzyskać wartość, a ona cofnie się, przejdzie do oryginalnej formy niezainicjowanej, a następnie zainicjuje ponownie, gdy spróbuje innej odpowiedzi. Coś jak, jeśli miałeś test (1). test (2). test (3). i wpisujesz test (X). do konsoli da ci 1,2 i 3 z powodu cofnięcia. – Matt

0
print_from_1_to_10 :- 
     print_from_X_to_10(1). 

print_from_X_to_10(X) :- 
     (
       X > 10 
     -> 
       fail 
     ; 
       writeln(X), 
       NewX is X + 1, 
       print_from_X_to_10(NewX) 
     ).