gpt4 book ai didi

prolog - 列出交集,Prolog

转载 作者:行者123 更新时间:2023-12-02 00:33:38 24 4
gpt4 key购买 nike

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

  1. 解析以列表形式给出的句子,在这种情况下(以及整个示例中)句子将是 [the,traitorous,tostig_godwinson,was,slain]。 (它的历史,不要问!)所以这看起来像:

    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. 使用目标列表并将其与知识库进行比较,以基本上回答您在第一时间提出的问题(参见下面的代码),因此使用该问题和知识库,程序将打印出“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,_).

正如我所说,在我尝试 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 谓词中的 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. 重复最后一个副词
  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 作为结果。

关于prolog - 列出交集,Prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5589008/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com