Как написать стандартным подходящим способом avs_term_rearranged(AVs, T, AVsR)
с заданными AVs
и T
так, чтобы AVsR
было перестановкой AVs
с элементами, расположенными в том же порядке, что и их переменные в порядке слева направо в T
.
AVs
- это список элементов формы A = V
, где A
- атом, обозначающий имя переменной, например 'X'
, а V
- соответствующая переменная. Такие списки создаются read_term/2,3
с опцией чтения variable_names/1
(7.10.3). Кроме того, точный порядок элементов не определен.
| ?- read_term(T,[variable_names(AVs)]).
A+B+A+_+C.
AVs = ['A'=A,'B'=B,'C'=C]
T = A+B+A+_+C
T
- это термин, который содержит все переменные AVs
плюс еще несколько.
Обратите внимание, что в стандартной соответствующей программе нельзя полагаться на порядок терминов для переменных (7.2.1):
7.2.1 Переменная
Если
X
иY
- переменные, которые не идентичны, тоX
term_precedesY
должен зависеть от реализации, за исключением того, что во время создания отсортированного списка (7.1.6.5, 8.10.3.1 j) порядок должен оставаться постоянным.ПРИМЕЧАНИЕ. Если
X
иY
являются анонимными переменными, то они не являются идентичными терминами (см. 6.1.2 a).
Рассмотрим в качестве примера из 8.4.3.4:
sort([f(U),U,U,f(V),f(U),V],L).
Succeeds, unifying L with [U,V,f(U),f(V)] or
[V,U,f(V),f(U)].
[The solution is implementation dependent.]
Итак, есть два возможных варианта работы sort/2
, и нельзя даже полагаться на успех:
sort([f(U),U,U,f(V),f(U),V],L), sort(L, K), L == K.
Например:
?- avs_term_rearranged(['A'=A,'B'=B,'C'=C], A+C+F+B, AVsR).
AVsR = ['A'=A,'C'=C,'B'=B].
T
произвольный термин или имеет ту же форму? это, например, также получено изread_term
? - person Christian Fritz   schedule 25.01.2014T
в своем вопросе с разными значениями. Может помочь переименовать один из них, чтобы избежать путаницы. - person Christian Fritz   schedule 25.01.2014T
используется в качестве аргумента для искомого предиката, а один раз он используется сread_term
, который в этом случае производитT
иAVs
так, чтобы они соответствовали предикату. - person false   schedule 25.01.2014avs_term_rearranged(['A'=A,'B'=B,'C'=C], A+C+F+B, ['A'=A,'C'=C,'B'=B])
? - person Christian Fritz   schedule 25.01.2014ream_term/3
для чтения из потока, который вы пишете, используяwrite_term/3
, тогда вы можете получить представление переменных вT
, которое соответствует таковому дляAVs
, и в этот момент это простой вопрос отбрасывания изT
-переменных все те, которые не фигурируют вAVs
переменных. - person Christian Fritz   schedule 25.01.2014read_term/3
иwrite_term/3
используют один и тот же формат. И определение переменных void находится здесь: stackoverflow.com/questions/7947910/ - person false   schedule 25.01.2014T
был не термином, а атомом, например,'A+C+F+B'
, тогда это было бы очень просто, не так ли? Итак, вы действительно ищете способ получить символы, используемые для несвязанных переменных вT
. Правильный? - person Christian Fritz   schedule 27.01.2014T
является атомом (что тоже является термином), то егоAVs
должно быть[]
. Я не уверен в используемой вами терминологии. - person false   schedule 27.01.2014term_variables/2
? Его функциональность не зависит от имен переменных. - person false   schedule 27.01.2014prolog-variable-names
, связанного с темами о переименовании переменных с использованием предикатов, таких как numbervars / 3. Жду вашего отзыва. - person Guy Coder   schedule 01.02.2020