列表交叉点,Prolog

列表交叉点,Prolog,prolog,Prolog,好的,这个程序基本上必须执行3项任务: 解析以列表形式给出的句子,在本例中(以及整个示例中),该句子将是[the,叛徒,tostig_godwinson,was,slain]。(不要问它的历史!)所以这看起来像: sentence(noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))),verb_phrase(verb(slain),np(noun(slain)))). 使用解析后的句子提取主语、动词和宾语

好的,这个程序基本上必须执行3项任务:

  • 解析以列表形式给出的句子,在本例中(以及整个示例中),该句子将是[the,叛徒,tostig_godwinson,was,slain]。(不要问它的历史!)所以这看起来像:

    sentence(noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))),verb_phrase(verb(slain),np(noun(slain)))).
    
  • 使用解析后的句子提取主语、动词和宾语,并作为列表输出,例如使用当前示例的
    [tostig_godwinson,was,slain]
    。在我尝试3号之前,我也一直在工作

  • 使用目标列表并将其与知识库进行比较,以基本回答您在第一位提出的问题(参见下面的代码)因此,使用这个问题和知识库,程序将打印出“斯坦福桥之战”,因为这是知识库中与问题列表最匹配的句子

  • 这就是我目前的处境:

    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,_).
    
    正如我所说,在我尝试使用数字3之前,数字2一直在工作,现在它只打印出解析后的句子,然后给我一个“错误:本地堆栈外消息”,非常感谢您的帮助!因此,在顶部是我们用来比较列表以找到最佳匹配的知识库,这些知识库由best_match方法调用(尽管在这个阶段不正确),该方法在分析句子并提取关键字的句子方法之后立即执行。此外,如果代码的布局非常糟糕,我也表示歉意!
    干杯

    我想发布这篇文章的人永远不会回来了,我想提醒自己一些开场白,就在这里

    除了在某些谓词中仍然存在一些逻辑问题之外,这段代码还有两个主要问题

    问题1: 您忽略了单例警告,它们通常是不可忽略的。最佳匹配谓词应如下所示:

    best_match(Subject,Object,Verb):-
            history(X,Y),
            member(Subject,Y),
            member(Object,Y),
            member(Verb,Y),
            write(X),nl,
            fail.
    
    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).
    
    np(Sentence,np(NP,PP),Rem):-
      append(List1,List2,Sentence),
      List1\=[],
      List2\=[],
      np(List1,NP,Rem1),
      append(Rem1,List2,Rem2),
      pp(Rem2,PP,Rem).
    
    另一个警告是关于
    语句
    谓词中的
    语句
    变量,因此它是这样的:

    best_match(Subject,Object,Verb):-
            history(X,Y),
            member(Subject,Y),
            member(Object,Y),
            member(Verb,Y),
            write(X),nl,
            fail.
    
    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).
    
    np(Sentence,np(NP,PP),Rem):-
      append(List1,List2,Sentence),
      List1\=[],
      List2\=[],
      np(List1,NP,Rem1),
      append(Rem1,List2,Rem2),
      pp(Rem2,PP,Rem).
    
    问题2: 我假设您将np逻辑划分为np和np2以避免无限循环,但后来忘记在需要的地方应用此划分。最长的np条款应为:

    np(Sentence,np(NP,PP),Rem):-
            np2(Sentence,NP,Rem1),
            pp(Rem1,PP,Rem).
    
    如果你真的想允许更复杂的np,我怀疑,你可以这样做:

    best_match(Subject,Object,Verb):-
            history(X,Y),
            member(Subject,Y),
            member(Object,Y),
            member(Verb,Y),
            write(X),nl,
            fail.
    
    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).
    
    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,因为您要确保每次选中的句子都更短

    次要问题: (无限循环问题解决后,程序如何工作)

  • 最后一个vp重复
  • 我不太清楚你的语法,例如为什么
    “flused”
    是一个名词 为了检查程序是否有效,我使用了一句话
    [edwardIV,击败,henryVI,on,palm_Sunday]。

    我将
    “挫败”
    改为动词,并将最后一个
    vp
    子句改为:

    vp([H|T],vp(verb(H),Rest)):-
        verb(H),
        np(T,_,Rest1),      
        pp(Rest1, Rest,_).
    
    对于示例句子,我得到了城市桥战役和托顿战役的结果