Я хочу добавить ([], C, C), где C - список, содержащий некоторые элементы. Является ли это возможным? Я добавлю некоторый список в C, содержащий элементы append (Найдено, C, C), если другое условие истинно. А также я хочу сохранить окончательное значение в C переменной D. Как я могу это сделать?Как назначить один список переменной в прологе?
ответ
Я хочу добавить ([], C, C), где C - список, содержащий некоторые элементы. Является ли это возможным?
append([],C,C)
всегда верно. Пустой список в сочетании с чем угодно - это что угодно. Посмотрите, что Пролог говорит, когда вы пытаетесь его:
?- append([],C,C).
true.
Это true
без каких-либо привязок говорит вам, что Пролог создал доказательство, но никаких новых привязки не были созданы в результате. Этот код будет иметь тот же результат:
meaningless(_, _, _).
?- meaningless(everybody, X, Squant).
true.
Это говорит о том, что ваше желание неуместно. append([], C, C)
не делает, что вы думаете, что он делает.
При добавлении другого условия я добавлю некоторый список в C, содержащий элементы append (Найдено, C, C). А также я хочу сохранить окончательное значение в C переменной D. Как я могу это сделать?
Мышление в терминах «хранения» и других операций, подразумевающих изменчивое состояние, является верным признаком того, что вы не понимаете Prolog. В Prolog вы устанавливаете привязки (или утверждаете факты в динамическом хранилище, который является tar-ямой для начинающих). Нечто подобное может быть достигнуто в моде на Прологе, делая что-то вроде этого:
frob(cat, List, Result) :- append([cat], List, Result).
frob(dog, List, List).
Этот предикат frob/3
имеет два в-параметра: атом и список. Если атом равен cat
, он добавит [cat]
в начало списка. Поток, который вы видите между аргументами в главе предложения и их использованием в теле предложения, - это то, как Prolog управляет состоянием. В принципе, все состояния в Prolog находятся либо в стеке вызовов, либо в динамическом хранилище.
Чтобы дать пример в Python, рассмотреть эти два пути реализации факториала:
def fac(n):
result = 1
while n > 1:
result = result * n
n = n - 1
Эта версия имеет переменную result
, которая является своего рода государства. Мы мутируем состояние неоднократно в цикле для достижения расчета. В то время как факторная функция может быть определена как fac (n) = n * fac (n-1), эта реализация не имеет fac (n-1), скрывающейся в коде где-либо явно.
Рекурсивный метод будет:
def fac(n):
if n < 1:
return 1
else:
return n * fac(n-1)
Там нет явного состояния здесь, так как делает вычисление работы? Состояние неявно, оно выполняется в стеке. Процедурные программисты склонны поднять скептическую бровь при рекурсии, но в Prolog нет такой вещи, как assignable, поэтому первый метод не может быть использован.
Назад к frob/3
, условие неявно относится к первому аргументу.Поведение различно в теле, потому что в первом теле третий аргумент будет связан с третьим аргументом вызова append/3
, который будет объединяться со списком атома cat
, добавленным ко второму аргументу List
. Во втором теле ничего особенного не произойдет, и третий аргумент будет привязан к тому же значению, что и второй аргумент. Поэтому, если вам нужно позвонить frob(Animal, List, Result)
, Result
будет связан с cat
спереди или не на основании того, что Animal
есть.
Не перепутайтесь и подумайте, что Prolog просто обрабатывает последний аргумент как возвращаемое значение! Если бы это было правдой, то это, конечно, не работает так:
?- frob(X, Y, [whale]).
X = dog,
Y = [whale].
То, что кажется, что здесь произошло, что Пролог мог бы сказать, что, потому что список не начать с cat
он был в состоянии сделать вывод о том, что X был dog
. Хорошие программисты Prolog стремятся поддерживать эту иллюзию в своих API-интерфейсах, но все, что на самом деле произошло здесь, состоит в том, что Prolog ввел первое правило, которое расширилось до append([cat], X, [whale])
, а затем унификация потерпела неудачу, потому что Prolog не смог найти X, который имел [cat]
, добавленный к он будет генерировать [whale]
. В результате он перешел ко второму правилу, которое объединяет X с dog
и вторыми двумя аргументами друг с другом. Следовательно, Y = [whale]
.
Надеюсь, это поможет!
- 1. Как восстановить один список в прологе?
- 2. Назначить список переменной ssis
- 3. назначить список переменной в цикле
- 4. Как перечислить список в Прологе?
- 5. Список списков в прологе?
- 6. Заменить список в прологе
- 7. Список переупорядочивания в прологе
- 8. Как назначить список параметров «$ @» другой переменной?
- 9. Как заполнить список в Прологе?
- 10. Как разбить список в прологе?
- 11. преобразовать термин переменной в прологе
- 12. список строки в прологе
- 13. реорганизовать список в прологе
- 14. список Compute в Прологе
- 15. Разбиение список в Прологе
- 16. Список факториалов в Прологе
- 17. растягивание список в прологе
- 18. Сформировать список в прологе
- 19. Список размотки в Прологе
- 20. Список менее в Прологе
- 21. назначить список локальной переменной в схеме
- 22. Прологе список фактов
- 23. объединение всех возможных результатов в один список в прологе
- 24. Как назначить переменной псевдоним
- 25. Рекурсия в прологе, привязка к переменной
- 26. Как отсортировать список веков в прологе?
- 27. Как назначить переменной TextFile?
- 28. Сохранять результат переменной в прологе?
- 29. Добавить в список в прологе
- 30. Прологе список атомов
Uhhh ... унификация? – Mephy
'append ([], C, C)' говорит, что * 'C 'добавлен в конец' [] 'is' C' *, который всегда является true, если 'C' - любой список. Так что немного непонятно, что вы просите. – lurker