如何解决maplist 仅适用于列表列表的第一个列表?
为什么 maplist 只适用于 list-of-lists 的第一个列表?
%% given K:V match return V2 specified by K2
kv2kv(K:V,ResK,HL,Res) :- writeln(HL),member(K:V,HL),member(ResK:Res,HL).
find(K:V,FSL,S) :- maplist(kv2kv(K:V,word),S).
示例:
?- fs7(L).
L = [[word:we,pos:pron,dep:nsubj],[word:are,pos:aux,dep:root],[word:about,pos:adj,dep:acomp],[word:to,pos:part,dep:aux],[word:finish,pos:verb,dep:xcomp],[word:the,pos:det,dep:det],[word:game,pos:noun,dep:dobj]].
?- fs7(L),find(dep:root,L,R).
[word:we,dep:nsubj]
false.
作为一个快速问题,kv2kv 子句使用两个成员查询,我想它会检查列表两次是否有更好的解决方案。
解决方法
这就解决了:
kv2kv(K:V,K2:V2,HL) :- member(Lst,HL),member(K:V,Lst),member(K2:V2,Lst).
例如:
fs58(L),kv2kv(dep:root,word:R,L).
,
您本质上是在问为什么某个特定目标会失败。这是您仍然失败的程序的概括。现在应该很明显是什么原因了。任何进一步的概括都会使这个程序成功。因此,您需要对剩余的可见部分进行更改。
:- op(950,fy,*). * _G_0. % serves to generalize goals away fs7(L) :- L = [[word:_/*we*/,pos:_/*pron*/,dep:nsubj] | _/* [word:are,pos:aux,dep:root],[word:about,pos:adj,dep:acomp],[word:to,pos:part,dep:aux],[word:finish,pos:verb,dep:xcomp],[word:the,pos:det,dep:det],[word:game,pos:noun,dep:dobj] */]. %% given K:V match return V2 specified by K2 kv2kv(K:V,ResK,HL,Res) :- *writeln(HL),*member(ResK:Res,HL). find(K:V,FSL,S) :- maplist(kv2kv(K:V,_/*word*/),S). :- fs7(L),find(dep:root,L,R).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。