Какую реализацию Пролога вы используете и откуда вы взяли цель {}/(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.