检查列表中与变量列表一致的所有单词

Posted

技术标签:

【中文标题】检查列表中与变量列表一致的所有单词【英文标题】:Checking all the words in list that unify with list of variables 【发布时间】:2020-08-07 06:24:43 【问题描述】:

所以我有一个谓词palavras_possiveis_esp(Leters,Spaces,Space,Words_pos),Leters 是类似[[d,a,y],[n,i,g,h,t],[s,u,n],[m,o,o,n]] 的单词列表,Spaces 是类似[[P11,P12,P13],[P11,P21,P31,P41],[P13,P23,P33]] 的列表列表,Space 是带有类似[P11,P12,P13] 的变量的列表,而 Words_pos 是所有可以与一定空间统一的词。

首先,我做了这个谓词espacos_pal_uni(Spaces,Leters),这个谓词的目的是将所有Eps与Ltrs中的任何单词统一

例子:

?- espacos_pal_uni([[d, P21, P31, P41, P51],[a, P23, P33, P43, P53]],[[a,m,e,n,o],[a,t,o],[d,a,o],[d,r,a,m,a],[m,a,e],[m,a,n,d,e],[s,e,d,e],[s,o,a,r]]).P21 = r,
P31 = P51, P51 = a,
P41 = P23, P23 = m,
P33 = e,
P43 = n,
P53 = o.

从示例中可以看出,空间[d, P21, P31, P41, P51] 与单词戏剧统一,空间[a, P23, P33, P43, P53] 与单词 ameno 统一。

其次,我创建了这个谓词palavra_possivel_esp(Word, Space, Spaces, Leters),这个谓词的目的是将空格与Word统一,如果它们是,那么它们将与Esp具有公共变量的Eps与Ltrs中的任何单词统一

例子:

?- Letras = [[a,m,e,n,o],[a,t,o],[d,a,o],[d,i,a],[d,r,a,m,a],[m,a,e],[m,a,n,d,e],[s,e,d,e],[s,o,a,r]], Espacos = [[P11, P12, P13], [P15, P16, P17, P18],
[P23, P24, P25],
[P35, a, P37],
[P41, P42, P43, P44, P45],
[P11, P21, P31, P41, P51],
[P13, P23, P33, P43, P53],
[P15, P25, P35, P45],
[P17, P27, P37]],
palavra_possivel_esp([d,i,a], [P11,P12,P13], Espacos, Letras).

P11 = P35, P35 = d,
P12 = i,
P13 = P31, P31 = P51, P51 = a,
P21 = r,
P23 = P41, P41 = m,
P33 = e,
P37 = P53, P53 = o,
P43 = n,
Letras = [[a, m, e, n, o], [a, t, o], [d, a, o], [d, i, a], [d, r, a, m|...], [m, a, e], [m, a|...], [s|...], [...|...]],
Espacos = [[d, i, a], [P15, P16, P17, P18], [m, P24, P25], [d, a, o], [m, P42, n, P44|...], [d, r, a|...], [a, m|...], [P15|...], [...|...]].

?- Leters = [[a,m,e,n,o],[a,t,o],[d,a,o],[d,i,a],[d,r,a,m,a],[m,a,e],[m,a,n,d,e],[s,e,d,e],[s,o,a,r]], Spaces = [[P11, P12, P13], [P15, P16, P17, P18],
[P23, P24, P25],
[P35, a, P37],
[P41, P42, P43, P44, P45],
[P11, P21, P31, P41, P51],
[P13, P23, P33, P43, P53],
[P15, P25, P35, P45],
[P17, P27, P37]],
palavra_possivel_esp([d,a,o], [P11,P12,P13], Spaces, Leters).

1) 所以这里发生的事情是谓词将单词[d,i,a][P11,P12,P13] 统一起来,然后它检查与该空间具有共同变量的空间,即[[P11, P21, P31, P41, P51], [P13, P23, P33, P43, P53]],然后它会判断是否存在是 Letters 中与 [[d, P21, P31, P41, P51], [a, P23, P33, P43, P53]] 统一的任何单词,即 ameno 和 Drama。

2) 至于dao这个词,谓词将[d,a,o][P11,P12,P13]统一起来,然后检查与那个Sapce有共同变量的Eps,即[[P11, P21, P31, P41, P51], [P13, P23, P33, P43, P53]],然后判断是否有是 Leters 中与[[d, P21, P31, P41, P51], [o, P23, P33, P43, P53]] 统一的任何单词,第一个单词可以与戏剧统一,但由于没有以 o 开头的单词,所以它返回 False。

第三,我创建了一个谓词palavras_possiveis_esp(Leters, Spaces Space, Words_Pos),,它的Words_Pos 是一个包含特定空格的所有单词的列表。

例子:

?- Letras = [[a,m,e,n,o],[a,t,o],[d,a,o],[d,i,a],[d,r,a,m,a],[m,a,e],[m,a,n,d,e],[s,e,d,e],[s,o,a,r]], Espacos = [[P11, P12, P13], [P15, P16, P17, P18],
[P23, P24, P25],
[P35, a, P37],
[P41, P42, P43, P44, P45],
[P11, P21, P31, P41, P51],
[P13, P23, P33, P43, P53],
[P15, P25, P35, P45],
[P17, P27, P37]],
palavras_possiveis_esp(Letras, Espacos,[P11,P12, P13], Pals_Possiveis).
P11 = P35, P35 = d,
P12 = i,
P13 = P31, P31 = P51, P51 = a,
P21 = r,
P23 = P41, P41 = m,
P33 = e,
P37 = P53, P53 = o,
P43 = n,
Letras = [[a, m, e, n, o], [a, t, o], [d, a, o], [d, i, a], [d, r, a, m|...], [m, a, e], [m, a|...], [s|...], [...|...]],
Espacos = [[d, i, a], [P15, P16, P17, P18], [m, P24, P25], [d, a, o], [m, P42, n, P44|...], [d, r, a|...], [a, m|...], [P15|...], [...|...]],
Pals_Possiveis = [[d, i, a]].

这里的问题是,如果有超过 1 个单词与空格结合,谓词返回一个包含第一个单词的列表,而不是包含所有单词的列表。

我认为的问题是,当它搜索第一个单词并将其与空格统一时,由于空格将不再是变量列表,因此它将始终与其余单词不同,并且会返回第一个字,我看不出我是如何解决这个问题的。

我认为主要问题在于 espacos_pal_uni 谓词。

程序:

espacos_pal_uni([],_) :- true.

espacos_pal_uni([E|RE],LP) :- member(E,LP),
                              espacos_pal_uni(RE,LP).


palavra_possivel_esp(Pal, Esp, Esps, Letras) :-
    length(Pal,C1),
    length(Esp,C2),
    C1 == C2,
    Pal = Esp,
    espacos_com_posicoes_comuns(Esps,Esp,NEsps),
    espacos_pal_uni(NEsps,Letras),!.

npalavra_possivel_esp(P, Esp, Esps, Ltrs) :- \+ palavra_possivel_esp(P, Esp, Esps, Ltrs).

palavras_possiveis_esp(Ltrs,Esps,Esp,Pals) :-
    palavras_possiveis_esp(Ltrs,Esps,Esp,Pals,Ltrs,[]).

palavras_possiveis_esp(_,_,_,AC,[],AC) :- !.


palavras_possiveis_esp(Ltrs,Esps,Esp,Pals,[P|R],AC) :-
    palavra_possivel_esp(P, Esp, Esps, Ltrs),
    append(AC,[P],NAC),
    palavras_possiveis_esp(Ltrs,Esps,Esp,Pals,R,NAC).

palavras_possiveis_esp(Ltrs,Esps,Esp,Pals,[P|R],AC) :-
    npalavra_possivel_esp(P, Esp, Esps, Ltrs),

【问题讨论】:

抱歉,这有点难以理解。练习的目标是什么?是按照第一段的描述写palavras_possiveis_esp(Ltrs,Esps,Esp,Pals)吗?里面的Esp 是什么?请重新格式化代码以便于阅读。也是。 Esp 是这样的列表 [P11,P12,P13] 基本上是一个包含变量的列表 【参考方案1】:

这看起来像是 Checking if a list of variables is unifiable with a list of lists containing letters 的部分副本。检查一个单词是否与“空格”统一的答案请参见那里。

这里的问题是,如果有超过 1 个单词与空格结合,谓词返回一个包含第一个单词的列表,而不是包含所有单词的列表。

要查找与“空格”统一的所有个单词的列表,请使用filter谓词而不是member/2

【讨论】:

以上是关于检查列表中与变量列表一致的所有单词的主要内容,如果未能解决你的问题,请参考以下文章

检查另一个字符串中的单词列表[重复]

如何进行`if`检查键入的单词是不是等于C中字符串列表中的某个单词? [复制]

检查列表中的单词并在 pandas 数据框列中删除这些单词

如何使用 .contains() 方法检查我的列表中是不是有任何单词

用于检查值是否在列表中不适用于集合的逻辑

在 Erlang 中检查列表中的项目