Проверка всех слов в списке, которые объединяются со списком переменных - PullRequest
0 голосов
/ 23 апреля 2020

Итак, у меня есть предикат под названием 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),

1 Ответ

0 голосов
/ 25 апреля 2020

Похоже, что это частично дубликат Проверка, является ли список переменных недопустимым со списком списков, содержащих буквы . См. Там для ответа для проверки, объединяется ли слово с "пробелом".

Проблема здесь в том, что, если есть больше чем 1 слово, которое объединяется с пробелом, предикат возвращает список с 1-е слово вместо списка со всеми словами.

Чтобы найти список всех слов, которые объединяются с пробелом, используйте предикат filter вместо member/2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...