0

为什么 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),FSL, 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,pos:pron,dep:nsubj]
false.

作为一个快速问题,kv2kv 子句使用两个成员查询,我想它会检查列表两次是否有更好的解决方案。

4

2 回答 2

1

你本质上是在问为什么一个特定的目标会失败。这是仍然失败的程序的概括。现在应该很清楚原因是什么了。任何进一步的概括都会使这个程序成功。因此,您需要更改剩余可见部分的某些内容。

:- op(950, fy, *)。

* _G_0。% 用于概括目标

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] */
        ]。



%% 给定 K:V 匹配返回由 K2 指定的 V2
kv2kv(K:V,ResK,HL,Res) :-
    * writeln(HL) ,
    成员(K:V,HL),
    *成员(ResK:Res,HL)。

查找(K:V,FSL,S):-
    maplist(kv2kv(K:V,_ /*word*/ ),FSL, S)。

 :- fs7(L),find(dep:root,L,R)。
于 2021-07-26T15:01:25.090 回答
0

这解决了它:

 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).
于 2021-07-26T14:55:52.750 回答