Итак, у меня есть предикат под названием 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)
, и цель этого предиката - объединить всех эспов с любым из слов в букв
.
Пример:
?- 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]
было объединено со словом амено.
Во-вторых, я создал этот предикат palavra_possivel_esp(Word, Space, Spaces, Leters)
, и цель этого предиката - объединить пробел с Word, если они есть, то они объединяют Esps, у которых есть общие переменные с Esp, с любым из слов в 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]]
, тогда он будет обнаружен, если в словах есть какое-либо слово, которое объединяется с [[d, P21, P31, P41, P51], [a, P23, P33, P43, P53]]
словами ameno и drama.
2) Что касается слова dao, предикат объединяет слово [d,a,o]
с [P11,P12,P13]
, а затем он проверяет эспов, которые имеют общие с этим Sapce переменные, которые равны [[P11, P21, P31, P41, P51], [P13, P23, P33, P43, P53]]
, затем он обнаружит, что если в словах есть какое-либо слово, объединяемое с [[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 слова, которое объединяется с пробелом, предикат возвращает список с 1-м словом вместо списка со всеми словами.
Проблема, я думаю, состоит в том, что, когда он ищет 1-е слово и объединяет его с пробелом, поскольку пробел больше не будет списком переменных, он всегда будет отличаться от остальные слова, и он вернет 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),