Lấy một ví dụ từ Introduction to Latin Wikiversity, hãy xem xét câu:Parsing inflected ngôn ngữ không phải thứ tự từ (ví dụ Latin)
the sailor gives the girl money
Chúng tôi có thể xử lý này trong Prolog với DCG khá thanh lịch với đống này các quy tắc:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
noun_phrase(Noun) --> det, noun(Noun).
noun_phrase(Noun) --> noun(Noun).
verb_phrase(vp(Verb, DO, IO)) --> verb(Verb), noun_phrase(IO), noun_phrase(DO).
det --> [the].
noun(X) --> [X], { member(X, [sailor, girl, money]) }.
verb(gives) --> [gives].
Và chúng ta thấy rằng công trình này:
?- phrase(sentence(S), [the,sailor,gives,the,girl,money]).
S = s(sailor, vp(gives, money, girl)) ;
dường như với tôi rằng DCG là thực sự được tối ưu hóa để xử lý ngôn ngữ theo thứ tự từ. Tôi đang ở một mất hoàn toàn như thế nào để xử lý câu Latinh này:
nauta dat pecuniam puellae
Điều này có nghĩa những điều tương tự (các thủy thủ cho tiền cô gái), nhưng thứ tự chữ hoàn toàn miễn phí: tất cả các hoán vị cũng có nghĩa là chính xác những điều tương tự:
nauta dat puellae pecuniam
nauta puellae pecuniam dat
puellae pecuniam dat nauta
puellae pecuniam nauta dat
dat pecuniam nauta puellae
việc đầu tiên xảy ra với tôi là để liệt kê các hoán vị:
sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP).
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP).
nhưng điều này sẽ không làm, vì trong khi nauta
thuộc s với cụm từ danh từ chủ đề, puellae
thuộc về cụm từ danh từ đối tượng là phụ thuộc vào động từ, nhưng có thể đứng trước nó. Tôi tự hỏi nếu tôi nên tiếp cận nó bằng cách xây dựng một số loại danh sách do đầu tiên như vậy:
?- attributed([nauta,dat,pecuniam,puellae], Attributed)
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)]
Điều này có vẻ như nó sẽ bật ra được cần thiết (và tôi không thấy một cách tốt để làm điều đó), nhưng về mặt ngữ pháp thì nó đang đẩy thức ăn xung quanh trên đĩa của tôi. Có lẽ tôi có thể viết một phân tích cú pháp với một số loại kinh hoàng contraption phi DCG như thế này:
parse(s(NounPhrase, VerbPhrase), Attributed) :-
parse(subject_noun_phrase(NounPhrase, Attributed)),
parse(verb_phrase(VerbPhrase, Attributed)).
parse(subject_noun_phrase(Noun), Attributed) :-
member(noun(Noun,nom), Attributed).
parse(object_noun_phrase(Noun), Attributed) :-
member(noun(Noun,acc), Attributed)
Điều này có vẻ như nó sẽ làm việc, nhưng chỉ chừng nào tôi còn không có đệ quy; ngay sau khi tôi giới thiệu một mệnh đề cấp dưới, tôi sẽ sử dụng lại các đối tượng theo cách không lành mạnh.
Tôi chỉ không thấy cách lấy từ một câu không theo thứ tự từ đến một cây phân tích cú pháp. Có một cuốn sách thảo luận về điều này? Cảm ơn.
tôi không, thực sự. –