pisałem to jako sposób, aby pomóc rozwiązań dopuszczalnych, chociaż istnieje nieskończenie wiele rozwiązań. Ale zdałem sobie sprawę, że istnieje sposób na zmianę reguł, aby najpierw uzyskać krótsze wyniki.
Ponieważ ad --> a, ad, d.
jest oceniany przed ad --> bc.
stara się zaspokoić ad --> a, ad, a.
przed ad --> bc.
. Wstawię ad --> bc.
przed ad --> a, ad, a.
. To samo dotyczy reguł bc --> b, b, bc, c, c.
i . Zgodnie z tym, co wskazano w arianach, najpierw zastosowane zostaną reguły kończące, które zapewniają, że krótsze rozwiązania zostaną znalezione jako pierwsze.
Chciałbym również zwrócić uwagę, że istnieją dwa rozwiązania dla []
s i s -> ad -> bc -> [] Wyeliminowałbym s --> [].
, ponieważ jest zbędny.
W sumie chciałbym spróbować tego rozwiązania:
s --> ad.
a --> [a].
b --> [b].
c --> [c].
d --> [d].
ad --> bc.
bc --> [].
ad --> a, ad, d.
bc --> b, b, bc, c, c.
Original post:
musiałem patrzeć, jak to zrobić liczenia (to było dawno zrobiłem prolog), ale nie są nieskończona liczba, a prolog próbuje znaleźć wszystkie rozwiązania, których nigdy nie przestaje szukać, chociaż jestem pewien, że trafisz w stos nad przepływie lub jakiś błąd przed nim :).
Jednym ze sposobów na ograniczenie liczby wyników, jest ograniczenie rozmiaru roztworu
phrase(s, X), length(X, 4).
otrzymuje wszystkie roztwory dokładnie z 4 wartości, która byłaby
X = [a, a, d, d]
X = [b, b, c, c]
wzrasta do 6 dałoby :
X = [a, a, a, d, d, d]
X = [a, b, b, c, c, d]
lub użyj zakresach:
phrase(s, X), length(X, Y), Y >= 4 , Y < 10, Y != 6.
Myślę, że jeśli zrozumiałem twoje pytanie, to dlatego, że istnieje wiele drzew, które można stworzyć, ponieważ w twojej gramatyce są pętle – Muggen
. Jak mam rozwiązać ten problem? : -? – Simon