\ + może być używany do tworzenia gramatyk, które są mniej niejednoznaczne. Zaletą używania \ + over! na przykład, jest pewna deklaratywność \ +, tak że na przykład wynikowe reguły DCG mogą zostać zmienione.
Pozwala dać przykład, rozważmy następujący Gramatyka:
s([X|Y]) --> t(X), s(Y). % 1
s([]) --> []. % 2
t(2) --> [a,a]. % 3
t(1) --> [a]. % 4
Powyższy gramatyka jest bardzo niejednoznaczne, na przykład uzyskać wielokrotność analizuje dla następującego kodu:
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
A = [2,1,2] ;
A = [2,1,1,1] ;
etc..
Załóżmy teraz ja chcesz preferować długą analizę t na krótkiej analizie t. . Mogę to zrobić z cięciem w następujący sposób:
t(2) --> [a,a], !. % 5
t(1) --> [a]. % 6
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Niestety, nie mogę zmienić kolejności. Ponieważ wykonanie następującego nie daje pożądanego rezultatu. Chociaż s (A) daje teraz wyniki w innej kolejności, jesteśmy z powrotem do punktu wyjścia, od gramatyka jest ponownie niejednoznaczna:
t(1) --> [a]. % 7
t(2) --> [a,a], !. % 8
?- phrase(s(A),[a,a,a,a,a]).
A = [1,1,1,1,1] ;
A = [1,1,1,2] ;
A = [1,1,2,1] ;
etc...
Teraz spróbujmy to samo z \ +. Możemy wymienić cięcie następującym negacji:
t(2) --> [a,a]. % 9
t(1) --> [a], \+ [a]. % 10
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
Teraz spróbujmy, czy możemy zmienić kolejność. Możemy zmienić kolejność reguł gramatycznych t // 1 :
t(1) --> [a], \+ [a]. % 11
t(2) --> [a,a]. % 12
?- phrase(s(A),[a,a,a,a,a]).
A = [2,2,1] ;
No
declarativity jest bardzo przydatna. Oznacza to na przykład: , że możemy użyć \ + w analizatorze składającym z prawej do lewej strony, że wybiera reguły gramatyczne w dowolnej kolejności. Deklaracja wiarygodności zapewnia, że u dołu do przodu łańcuchy parsera wykresu daje taki sam wynik niezależnie od kolejności wejściowej reguł DCG.
Wówczas możliwe jest zastosowanie techniki DCG w dużych projektach języka naturalnego (NL) o wartości , a także skalowanie. Gramatyki NL można empirycznie dostroić do determinizmu. Im bardziej determinująca gramatyka, tym bardziej efektywne jest jej analizowanie. Złożone gramatyki NL, które w przeciwnym razie są niedostępne, stają się wykonalne.
widzenia
+1, ale jestem sceptyczny * bardzo * o twoim twierdzeniu o deklaratywności: 'fraza (s ([1]), [a]). \ fP powiedzie się, ale' fraza (s ([1]), L) zawodzi. Dokładnie taki niepokój mnie martwi. – false
To znaczy: Jak narysować granicę między legalnymi zastosowaniami a nie legalnymi? – false
Nie żądam ogólnej deklaratywności. Napisałem "pewną deklaratywność". Możesz ustawić deklaratywność przeciwko adormentowi (= żargon bazy danych dla deklaracji trybu Prolog). Techniki można również zastosować do gramatyki. Zobacz także: ftp://ftp.inf.ethz.ch/doc/tech-reports/1xx/177.pdf –