2014-09-28 4 views
0

Я хочу добавить ([], C, C), где C - список, содержащий некоторые элементы. Является ли это возможным? Я добавлю некоторый список в C, содержащий элементы append (Найдено, C, C), если другое условие истинно. А также я хочу сохранить окончательное значение в C переменной D. Как я могу это сделать?Как назначить один список переменной в прологе?

+1

Uhhh ... унификация? – Mephy

+2

'append ([], C, C)' говорит, что * 'C 'добавлен в конец' [] 'is' C' *, который всегда является true, если 'C' - любой список. Так что немного непонятно, что вы просите. – lurker

ответ

1

Я хочу добавить ([], 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].

Надеюсь, это поможет!

Смежные вопросы