检查列表中与变量列表一致的所有单词
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中字符串列表中的某个单词? [复制]