Поиск букв в слове, которые имеют разные порядки - PullRequest
1 голос
/ 10 марта 2012

Вот описание программы пролога, над которой я работаю:

пользователь может ввести 5-буквенное слово, и допускаются только буквы a, b, c, d, e. Он может не вводить все слова, поэтому он может вводить что-то вроде userWord (A, b, C, d, E) - поэтому заполняются только b и d. Эти буквы можно вводить в любом порядке. Я должен заставить это работать, не используя списки или функции и используя только обоснованные факты.

Вот что у меня есть:

values(a,b,c,d,e).

userWord(U,W,X,Y,Z):-
    values(A1,A2,A3,A4,A5),
    findletters(U,W,X,Y,Z,A1,A2,A3,A4,A5).   % U-Z are outputs and A1-A5 are inputs


findletters(A1,A2,A3,A4,A5,A1,A2,A3,A4,A5):-
    findletters(A2,A1,A3,A4,A5,A1,A2,A3,A4,A5).

Мне нужно иметь findletters, который меняет порядок букв, пока не найдет хорошее совпадение. Конечно, мне может понадобиться несколько писем, которые по-разному меняют порядок. Но я не могу понять, как это сделать

  1. вызвать поисковики с возможными значениями
  2. запомните значения только a, b, c, d, e
  3. заставляет его принимать последний сгенерированный им ордер (который не удался), работает над этим и меняет ордера, пока не найдет хорошее совпадение.

Любая помощь чрезвычайно ценится

Ответы [ 4 ]

0 голосов
/ 21 ноября 2013

На самом деле, это проще, чем я думал.

letter(a).
letter(b).
letter(c).
letter(d).
letter(e).

userword(V, W, X, Y, Z) :-
  letter(V),
  letter(W),
  letter(X),
  letter(Y),
  letter(Z),
  V \= W,
  V \= X,
  V \= Y,
  V \= Z,
  W \= X,
  W \= Y,
  W \= Z,
  X \= Y,
  X \= Z,
  Y \= Z.

Мы хотим, чтобы все буквы в пользовательском слове были, ну, ну, буквНам также нужно, чтобы они были уникальными.Вот и все.

0 голосов
/ 12 марта 2012
values(a,b,c,d,e).


userWord(A,B,C,D,E):-
    values(A,B,C,D,E).
userWord(A,B,C,D,E):-
    reArr(A,B,F,G),reArr(B,C,H,I),reArr(C,D,J,K),reArr(D,E,L,M).
    userWord(F,G,I,K,M).

reArr(X,Y,X,Y):-X<Y.            %For this check the variables must be bound and must be converted into ASCII code..
reArr(X,Y,X,Y):-reArr(Y,X,Y,X).

Я думаю, что приведенная выше логика поможет вам ... Попробуйте и отправьте свой код успеха ..

Спасибо, Cling:)

0 голосов
/ 12 марта 2012

Это может быть бессмысленно, но ваша задача может быть решена всего лишь вызовом:

userWord(A,B,C,D,E) :- permutation([a,b,c,d,e], [A,B,C,D,E]).

Перестановка 5 различных значений требует 120 фактов.

Это не разумно делать это вручную. Если вам разрешено обманывать , то используйте permutation / 2, чтобы сгенерировать все факты и утвердить их, или записать в файл Prolog, чтобы к ним обращались.

Извините, я не знаю более простого алгоритма, чем перестановка / 2, и я с нетерпением жду возможности выяснить, существует ли такой алгоритм или какой-нибудь интересный трюк.

0 голосов
/ 10 марта 2012

Далее разбивайте свои предикаты, используйте letter(a). letter(b). ... letter(e). Это поможет обнаружить, что были введены только действительные буквы.

Может быть, использовать это так:

userWord(A,B,C,D,E) :-
    letter(A), letter(B), ...,letter(E), /* this will fail here on 
                                            non-valid letter */
    .... /* if it gets here the letters form a valid(?) word */

В качестве альтернативы, если вы хотите печатать, вы можете добавить факты для всех комбинаций «abcde» :) или позволить прологу сгенерировать его: word(AA,BB,CC,DD,EE):- letter(AA), ..., letter(EE). Это сгенерирует «слова» типа «aaaaa», которые могут быть не что вы хотите, и в этом случае вам нужно добавить: AA!=BB,AA!=CC,...,DD!=EE. к слову () - предложение.

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