2012-10-06 10 views
8

w regułach gramatycznych (), istnieje kilka predefiniowanych konstrukty: (',')//2 sens konkatenacji, ('|')//2 czyli naprzemienne itd. Jeden konstrukt, który jest obsługiwany przez kilku, lecz nie wszystkich systemów prologu (\+)//1.Uzasadnione zastosowania ( +) // 1

Osobiście użyłem go tylko ze względu na jego użycie. Nigdy nie widziałem tego w kodzie napisanym przez innych.

Czy są zatem dozwolone zastosowania (\+)//1?

Edycja: A dodatkowo, czy istnieją zgodne z prawem zastosowania (\+)//1 w zapytaniu phrase(nt, L) z L zmienną niepotwierdzoną.

Odpowiedz

4

\ + 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

+0

+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

+0

To znaczy: Jak narysować granicę między legalnymi zastosowaniami a nie legalnymi? – false

+0

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 –

1

Gdy L nie jest tworzony po czym używany gramatyki do wytwarzania tekstu. Wtedy nie potrzebujesz gramatyki \ + w ogóle. Ponieważ nie ma więcej problemu z niejednoznacznością z jakiegoś tekstu.

Pozwala dać przykład, rozważmy następującą gramatykę:

s([X|Y]) --> t(X), s(Y).    % 1 
s([]) --> [].      % 2 

t(2)  --> [a,a].     % 3 
t(1)  --> [a].      % 4 

Każda inna parse ma inny drzewo przetworzenia. I nie ma dwuznaczności w przy użyciu frazy/2 do generowania tekstu. Poniższe pytania dać dokładnie jedną odpowiedź:

?- phrase(s([2,1]),L). 
L = [a,a,a] 
?- phrase(s([1,2]),L). 
L = [a,a,a] 
?- phrase(s([1,1,1]),L). 
L = [a,a,a] 

Ale jest mały problem ponownego wykorzystania. Załóżmy, że gramaturę NL z \ + dla parsowania. Nie mogę go użyć do rozpakowania. Ponieważ wzorzec instancji celu \ + będzie inny, a zatem zmieni się semantyczna konstrukcja konstruktu .

Wyjście prawdopodobnie opiera się tylko na dwóch gramatykach. Jeden do parsowania i jeden do niepodpisania. Sądzę, że parsowanie i usuwanie są dwoma różnymi zdolnościami poznawczymi. Pamiętaj, że w szkole były ćwiczenia czytania i pisania. The samo dzieje się w informatyce.

myślę, że jest również w niektórych przypadkach można użyć jednego gramatyki, a widok \ + jako adnotację dla dezambiguacji, który jest odrzucany podczas unparse lub inaczej obsługiwane. Można zbudować taki mechanizm. Ale problemy z unparsing kontra parsowania są głębsze: Bidirectionallity warunków pomocniczych ({}/1), w lewo rekursji podczas unparsing, etc ...

Bye

+0

Znów może pomóc tutaj dedukcyjna technologia bazy danych. Ustanowienie dwukierunkowej adorment (= żargon bazy danych dla deklaracji trybu Prolog) jest pierwszym krokiem. Ale to już nie jest normalne Prolog. –

Powiązane problemy