Prolog: может назначить значение, подлежащее проверке, на основе этого условия соответствия (АНАГРАММА)

#prolog

#пролог

Вопрос:

Вот программа prolog, которая может связать число из одного списка с буквой из другого списка на основе их совпадающих позиций в соответствующих списках.

Так, например, у вас есть слово «прослушивание» и число 321645 У меня есть функция split, которая разбивает эти слова и цифры на таблицы, а затем функция assign_map, которая присваивает их вместе (что не работает так, как я хочу в настоящее время)

 split( '', [] ).
split(W,X):- atom_chars(W,X).

assign_map(A, B, LM):-
  split(A, LA),
  split(B, LB),
  maplist(map, LA, LB, LM).
  
map(A,B, A = B).
 

Проблема: мне нужно, чтобы буквы были присвоены переменной.
Например, буква «L» будет совпадать с числом 3
итак, я хочу, чтобы L было присвоено переменной PosThree, а затем то же самое для остальных букв.
Любая помощь будет оценена, спасибо

Ответ №1:

Вот моя попытка, вы можете добавить факты:

 split( '', [] ).
split(W,X):- atom_chars(W,X).

assignNum(A,B):-
    split(A,LA),
    split(B,LB),
    splitNum(LA,LB).

variable('0','PosZero').
variable('1','PosOne').
variable('2','PosTwo').
variable('3','PosThree').
variable('4','PosFour').
variable('5','PosFive').
variable('6','PosSix').
variable('7','PosSeven').
variable('8','PosEight').
variable('9','PosNine').


splitNum([H|T],[H2|T2]):-
       variable(H2,L),
        write(L),    
        write('='),
        writeln(H),
      splitNum(T,T2).

?-assignNum(listen,327654).
PosThree=l
PosTwo=i
PosSeven=s
PosSix=t
PosFive=e
PosFour=n
false

?-assignNum(award,82156).
PosEight=a
PosTwo=w
PosOne=a
PosFive=r
PosSix=d
false
 

Комментарии:

1. спасибо за ответ, это не совсем так, мне нужно, чтобы оно было переменным (L, PosThree), поэтому буква присваивается переменной, но на основе числа, которое находится рядом с ней

2. Вы имеете в виду переменную (‘L’,’PosThree’).? Можете ли вы сказать мне, каким должен быть результат?

3. Вывод на самом деле не имеет значения, но да, как вы говорите, переменная (‘L’,’PosThree’). таким образом, результат этого будет истинным. Но главное, что L присваивается PosThree, потому что число 3 и буква «L» находятся в одной и той же позиции в их списках

4. так, например, у меня есть listen и 327654, поэтому L и 3 должны быть PosOne, i и 2 должны быть PosTwo ….. и так далее?

5. на самом деле L является PosThree, потому что L совпадает с номером 3, поскольку число 3 и буква L находятся в одной и той же точке в их списках