Проверка, является ли список переменных недопустимым со списком списков, содержащих буквы - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть этот предикат spaces_uni(Spc,LstWords), Sp c - это список переменных, таких как [X,Y,Z] или [a,Y,Z], а LstWords - список слов, таких как [[o,r,a,n,g,e],[a,p,p,l,e],[b,a,n,a,n,a]].

Цель этого Предикат должен проверять, есть ли в LstWords какое-либо слово, которое можно объединить с указанным Sp c.

Пример:

?- Words = [[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]], Space = [d,A,B,C,D], spaces_uni(Space,Words).
true.

Так почему вывод верен, прост, потому что слово «драма» объединяется с [d, A, B, C, D] и становится [d, r, a, m, a]. Проблема в том, что моя программа вместо этого возвращает false, и я не понимаю, почему.

Программа:

spaces_uni(E,[P|R]) :-
                         length(E,CE),
                         length(P,CP),
                         CE \== CP,!,
                         spaces_uni(E,R).

spaces_uni(E,[P|R]) :-
                           length(E,CE),
                           length(P,CP),
                           CE == CP,!,
                           P \= E,
                           spaces_uni(E,R).


spaces_uni(E,[P|_]) :-
                         length(E,CE),
                         length(P,CP),
                         CE == CP,
                         {}/(P = E),!,
                         true.

Действительно, любая помощь будет оценена.

1 Ответ

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

Какую реализацию Пролога вы используете и откуда вы взяли цель {}/(P = E)?

Объединение Пролога уже отлично справляется с объединением списков:

?- [d, A, B, C, D] = [d, r, a, m, a].
A = r,
B = D, D = a,
C = m.

?- [x, A, B, C, D] = [d, r, a, m, a].
false.

Так что все, что вам нужно сделать, это написать предикат, который успешно выполняется, если список объединяется с одним элементом списка списков.

Что-то вроде:

word_words(Word, [Word | _Words]).
word_words(Word, [_Word | Words]) :-
    word_words(Word, Words).

, который работает следующим образом:

?- Words = [[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]], Space = [d,A,B,C,D], word_words(Space, Words).
Words = [[a, m, e, n, o], [a, t, o], [d, a, o], [d, r, a, m, a], [m, a, e], [m, a, n|...], [s, e|...], [s|...]],
Space = [d, r, a, m, a],
A = r,
B = D, D = a,
C = m ;
false.

Но нам даже не нужно определять наш собственный предикат word_words/2. Он не делает ничего, определяющего c со словами, и может показаться более знакомым, если мы переименуем некоторые вещи:

member_list(X, [X | _List]).
member_list(X, [_Y | List]) :-
    member_list(X, List).

Это просто предикат, выражающий членство в списке. Таким образом, нам вообще не нужно писать какие-либо определения предикатов, мы можем просто использовать существующие предикаты членства, которые, вероятно, поставляются с вашей реализацией Prolog:

?- Words = [[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]], Space = [d,A,B,C,D], member(Space, Words).
Words = [[a, m, e, n, o], [a, t, o], [d, a, o], [d, r, a, m, a], [m, a, e], [m, a, n|...], [s, e|...], [s|...]],
Space = [d, r, a, m, a],
A = r,
B = D, D = a,
C = m ;
false.

?- Words = [[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]], Space = [d,A,B,C,D], memberchk(Space, Words).
Words = [[a, m, e, n, o], [a, t, o], [d, a, o], [d, r, a, m, a], [m, a, e], [m, a, n|...], [s, e|...], [s|...]],
Space = [d, r, a, m, a],
A = r,
B = D, D = a,
C = m.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...