Пересечение списка, Пролог - PullRequest
3 голосов
/ 08 апреля 2011

хорошо, так что в основном есть 3 задачи, которые должна выполнить эта программа:

  1. Разбор предложения, заданного в форме списка, в данном случае (и во всем примере) предложениебудет [предатель, tostig_godwinson, был убит].(его история, не спрашивайте!), поэтому это будет выглядеть так:

    sentence(noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))),verb_phrase(verb(slain),np(noun(slain)))).
    
  2. использовать проанализированное предложение, чтобы извлечь тему, глагол и объект и вывести в виде списка,например, [tostig_godwinson,was,slain] используя текущий пример.У меня это тоже работало, пока я не попробовал номер 3.

  3. использовать список целей и сравнить его с базой знаний, чтобы в основном ответить на вопрос, который вы задали в 1-м месте (см. Код ниже)поэтому, используя этот вопрос и базу знаний, программа выведет «the_battle_of_stamford_bridge», так как это предложение в базе знаний с наибольшим количеством соответствий списку, о котором идет речь

так вот где яя до сих пор:

history('battle_of_Winwaed',[penda,       king_of_mercia,was,slain,killed,oswui,king_of_bernicians, took_place, '15_November_1655']).

history('battle_of_Stamford_Bridge',[tostig_godwinson,herald_hardrada,was,slain, took_place, '25_September_1066']).

history('battle_of_Boroughbridge',[edwardII,defeated,earl_of_lancaster,execution, took_place, '16_march_1322']).

history('battle_of_Towton',[edwardIV,defeated,henryVI,palm_Sunday]).

history('battle_of_Wakefield',[richard_of_york, took_place, 
'30_December_1490',was,slain,war_of_the_roses]).

history('battle_of_Adwalton_Moor',[earl_of_newcastle,defeats,fairfax, took_place, '30_June_1643',battle,bradford,bloody]).

history('battle_of_Marston_Moor',[prince_rupert,marquis_of_newcastle,defeats,fairfax,oliver_cromwell,ironsides, took_place, 
'2_June_1644', bloody]).

noun(penda).
noun(king_of_mercia).
noun(oswui).
noun(king_of_bernicians).
noun('15_November_1655').
noun(tostig_godwinson).
noun(herald_hardrada).
noun('25_September_1066').
noun(edwardII).
noun(earl_of_lancaster).
noun('16_march_1322').
noun(edwardIV).
noun(henryVI).
noun(palm_Sunday).
noun(richard_of_york).
noun('30_December_1490').
noun(war_of_the_roses).
noun(earl_of_newcastle).
noun(fairfax).
noun('30_June_1643').
noun(bradford).
noun(prince_rupert).
noun(marquis_of_newcastle).
noun(fairfax).
noun(oliver_cromwell).
noun('2_June_1644').
noun(battle).
noun(slain).
noun(defeated).
noun(killed).
adj(bloody).
adj(traitorous).
verb(defeats).
verb(was).
det(a).
det(the).
prep(on).

best_match(Subject,Object,Verb):-
        history(X,Y),
        member(Subject,knowledgebase),
        member(Object,knowledgebase),
        member(Verb,knowledgebase),
        write(X),nl,
        fail.
micro_watson:- write('micro_watson: Please ask me a question:'), read(X), 
sentence(X,Sentence,Subject,Object,Verb),nl,write(Subject),nl,write(Verb),nl,write(Object).

sentence(Sentence,sentence(Noun_Phrase, Verb_Phrase),Subject,Object,Verb):-
    np(Sentence,Noun_Phrase,Rem),
    vp(Rem,Verb_Phrase),
    nl, write(sentence(Noun_Phrase,Verb_Phrase)),
        noun(Subject),
    member(Subject,Sentence),
        noun(Object),
    member(Object,Rem),
    verb(Verb),
    member(Verb,Rem),
        best_match(Subject,Object,Verb).

member(X,[X|_]).
member(X,[_|Tail]):-
    member(X,Tail).
np([X|T],np(det(X),NP2),Rem):-
    det(X),
    np2(T,NP2,Rem).
np(Sentence,Parse,Rem):- np2(Sentence,Parse,Rem).
np(Sentence,np(NP,PP),Rem):-
        np(Sentence,NP,Rem1),
        pp(Rem1,PP,Rem).
np2([H|T],np2(noun(H)),T):-noun(H).
np2([H|T],np2(adj(H),Rest),Rem):- adj(H),np2(T,Rest,Rem).
pp([H|T],pp(prep(H),Parse),Rem):-
    prep(H),
    np(T,Parse,Rem).
vp([H|[]],verb(H)):-
    verb(H).
vp([H|T],vp(verb(H),Rest)):-
    verb(H),
    pp(T, Rest,_).
vp([H|T],vp(verb(H),Rest)):-
    verb(H),
    np(T, Rest,_).

Как я уже говорил, у меня работал номер 2, пока я не попробовал номер 3, теперь он просто выводит проанализированное предложение и затем выдает мне сообщение «Ошибка: сообщение из локального стека» любоепомощь очень ценится!Итак, наверху находится база знаний, с которой мы сравниваем список, чтобы найти наилучшее совпадение, они вызываются (хотя и некорректно на этом этапе) методом best_match, который выполняется сразу после метода предложения, который анализирует предложение и извлекаетключевые словаТакже я прошу прощения, если код ужасно выложен!Приветствия

1 Ответ

3 голосов
/ 08 января 2012

Я предполагаю, что человек, который опубликовал это, никогда не вернется, я хотел напомнить себе какой-нибудь пролог, так что вот оно.

У этого кода есть две основные проблемы, за исключением того факта, что в некоторых предикатах все еще есть некоторые логические проблемы.

Задача 1: Вы проигнорировали одиночные предупреждения, и они, как правило, являются чем-то, что нельзя игнорировать Предикат лучшего совпадения должен выглядеть так:

best_match(Subject,Object,Verb):-
        history(X,Y),
        member(Subject,Y),
        member(Object,Y),
        member(Verb,Y),
        write(X),nl,
        fail.

Другое предупреждение касалось переменной Sentence в предикате sentence, поэтому она выглядит следующим образом:

sentence(X,Subject,Object,Verb),nl,write(Subject),nl,write(Verb),nl,write(Object).

sentence(Sentence,Subject,Object,Verb):-

    np(Sentence,_,Rem),     
    vp(Rem,_),  
    nl, 
        noun(Subject),
    member(Subject,Sentence),
        noun(Object),
    member(Object,Rem),
    verb(Verb),
    member(Verb,Rem),
        best_match(Subject,Object,Verb).

Задача 2: Я предполагаю, что вы разделили логику np на np и np2, чтобы избежать бесконечных циклов, но потом забыли применить это деление именно там, где это было необходимо. Самое длинное предложение np должно быть:

np(Sentence,np(NP,PP),Rem):-
        np2(Sentence,NP,Rem1),
        pp(Rem1,PP,Rem).

Если вы действительно хотите разрешить более сложные np, в чем я сомневаюсь, вы можете сделать это так:

np(Sentence,np(NP,PP),Rem):-
  append(List1,List2,Sentence),
  List1\=[],
  List2\=[],
  np(List1,NP,Rem1),
  append(Rem1,List2,Rem2),
  pp(Rem2,PP,Rem).

Таким образом, вы не будете в конечном итоге вызывать np с одними и теми же аргументами снова и снова, потому что вы убедитесь, что проверяемое предложение короче каждый раз.

Незначительные проблемы: (Как работает программа после исправления проблемы с бесконечным циклом)

  1. повторяется последний vp
  2. Я не уверен в вашей грамматике, и, например, почему "defeated" является существительным ...

Просто чтобы проверить, работает ли программа, я использовал предложение [edwardIV,defeated,henryVI,on,palm_Sunday].

Я изменил "defeated" на глагол, а также изменил последнее предложение vp на:

vp([H|T],vp(verb(H),Rest)):-
    verb(H),
    np(T,_,Rest1),      
    pp(Rest1, Rest,_).

В качестве примера в качестве примера я получил battle_of_Boroughbridge и battle_of_Towton.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...