微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

maplist 仅适用于列表列表的第一个列表?

如何解决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 举报,一经查实,本站将立刻删除。