2011-04-08 5 views
3

ok, donc il y a essentiellement 3 tâches de ce programme doit effectuer:liste intersection, Prolog

  1. Parse une phrase donnée sous la forme d'une liste, dans ce cas (et dans l'exemple) de sa peine être [le, traître, tostig_godwinson, a été, tué]. (Son histoire, ne demandez pas!) Donc cela ressemblerait à ceci:

    sentence(noun_phrase(det(the),np2(adj(traitorous),np2(noun(tostig_godwinson)))),verb_phrase(verb(slain),np(noun(slain)))). 
    
  2. utiliser la phrase analysée pour extraire le sujet, le verbe et l'objet, et la sortie sous forme de liste, par exemple [tostig_godwinson,was,slain] en utilisant l'exemple actuel. J'ai eu ce travail aussi jusqu'à ce que j'ai essayé le numéro 3.

  3. utiliser la liste cible et le comparer à une base de connaissances pour répondre fondamentalement à la question que vous avez posée en 1ère place (voir le code ci-dessous) donc en utilisant cette question et la connaissance la base du programme imprimerait sur « the_battle_of_stamford_bridge » comme cela est la phrase dans la base de connaissances avec le plus de matches à la liste en question

voici donc où je suis jusqu'à présent:

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,_). 

comme j'ai dit que j'avais le numéro 2 travail jusqu'à ce que j'ai essayé le numéro 3, maintenant il imprime juste la phrase analysée et puis me donner une erreur: hors de la pile message local toute aide est grandement appréciée! En haut se trouve la base de connaissances avec laquelle nous comparons la liste pour trouver la meilleure correspondance, elles sont appelées (quoique incorrectement à ce stade) par la méthode best_match, qui s'exécute immédiatement après la méthode de phrase qui analyse la phrase et extrait le mots clés. Aussi je m'excuse si le code est terriblement agencé! Cheers

Répondre

3

Je suppose que la personne qui a posté cela ne reviendra jamais, je voulais me rappeler quelques prolog, alors le voici.

Il existe deux problèmes majeurs avec ce code, mis à part le fait qu'il existe toujours des problèmes logiques dans certains prédicats.

Problème 1: Vous avez ignoré les avertissements singleton, et ils sont généralement quelque chose à ne pas ignorer. Le meilleur prédicat match devrait ressembler à ceci:

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

L'autre avertissement était sur la variable Sentence dans le sentence prédicat, il va comme ceci:

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). 

Problème 2: Je suppose vous avez divisé la logique np en np et np2 pour éviter les boucles infinies, mais vous avez oublié d'appliquer cette division juste là où c'était nécessaire. La plus longue clause de np devrait être:

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

Si vous voulez vraiment permettre np plus compliqué là-bas, ce dont je doute, vous pouvez le faire comme ceci:

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

De cette façon, vous ne serez pas finir par appeler np avec les mêmes arguments encore et encore, parce que vous vous assurez que la phrase vérifiée est plus courte à chaque fois.

Problèmes mineurs: (Comment fonctionne le programme, après que le problème de boucle infinie a été corrigé)

  1. Le dernier vp est répété
  2. Je ne suis pas sûr de votre grammaire, et par exemple pourquoi "defeated" est un nom ...

Juste pour vérifier que le programme fonctionne je la phrase [edwardIV,defeated,henryVI,on,palm_Sunday].

J'ai changé "defeated" un verbe, et aussi changé la dernière clause vp à:

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

Pour l'exemple de phrase j'ai obtenu battle_of_Boroughbridge et battle_of_Towton comme résultats.