2017-01-04 5 views
0

Я думаю, что это очень легко, но я понятия не имею, как это сделать. Я пробовал приписывать, делая список, получая еще один список, но не работаю.Как заменить список в Prolog?

% H is the head of a coordenate and T the tail 
% E is the element that will be placed in the position T 
findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],H,T,E,NewTray) :- 
    H is 1,replace(L1,T,E,N),L1 = N; 
    H is 2,replace(L2,T,E,N),L2 = N; 
    ... 
    H is 10,replace(L10,T,E,N),L10 = N; 
    NewTray = [L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]. 

мне нужно, что L1 быть N в этой статье, я не знаю, как я могу создать условие для модификации L1 внутри п findLine. Я думал, в создании пункта, чтобы удалить все элементы и добавить новые по одному и называем это в attribuition месте:

%L is the list, C a counter and N the new list 
rewrite(L,C,N) :- 
     Q is C, 
     removeByIndex(Q,L,R), 
     (Q \== 0 -> rewrite(R,Q-1,N), !. 

    removeByIndex(0,[_|T],T):- !. 
    removeByIndex(I,[H|T],R):- X is I - 1, removeByIndex(X, T, Y), insert(H, Y, R). 

Но я Непрерывный с той же проблемой: L1 не изменяется :(

идея заключается в том изменить строку и заменить на подносе

PS:. Я прошу прощения за мой английский, но пролога темы почти inative в португальском форуме

+1

Что такое 'T'? Что такое 'E'? Вам нужно дать более подробную информацию о том, что вы хотите от этих предикатов. Некоторые примеры были бы хорошими. –

+0

Прошу прощения.Я отредактирую вопрос – Marcio

ответ

1

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

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

NewTray = [L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10]. 

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

Во-вторых, ваши случаи имеют такую ​​структуру:

H is 1,replace(L1,T,E,N),L1 = N; 

Первая ошибка здесь в том, что H is 1; is/2 предназначен для оценки арифметических выражений; нет никакой разницы между этим и H = 1 и эквивалентность L1 и N означает, что весь этот предикат, вероятно, может быть записана в виде:

findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],1,T,E,_) :- 
    replace(L1,T,E,L1). 
findLine([L0,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10],2,T,E,_) :- 
    replace(L2,T,E,L2). 
findLine(Line, _, _, Line). 

Я все еще смущает то, что вы пытаетесь сделать, смотря на то, ,

Я подозреваю, что вы думаете, что L1 будет иметь некоторое значение на пути в отношение и вдруг будет иметь новое, другое значение после использования отношения. Это решительно не случай: переменные в Prolog связаны ровно один раз; ваше назначение L1 = N или что-то еще не будет вызывает L1, чтобы «получить новое значение» (потому что в Прологе такого не может быть); вместо этого он сообщает Prolog, что L1 и N должны быть привязаны к одному и тому же значению. Это означает, что это зависит от обстоятельств; если они как почтовые, так и не равные, это приведет к сбою вашего предиката, например, но если любой из них не имеет земли, он примет значение другого.

Я смотрю на то, что вы делаете здесь, и я не могу не думать, что вы, по сути пытается сделать это:

replace([], _, _, []). 
replace([H|T], 1, X, [X|T]). 
replace([H|T], N, X, [H|Replaced]) :- 
    N > 1, succ(N0, N), replace(T, N0, X, Replaced). 

Используйте это так:

?- replace([1,2,3,4,5], 3, foo, Result). 
Result = [1, 2, foo, 4, 5] 

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

В любом случае, я надеюсь, что это поможет! Может быть, если вы покажете нам больше того, что вы пытаетесь сделать, будет более понятно, как мы можем помочь.

Редактировать: Разработка на = и объединение

Давайте возиться с = и посмотреть, что не происходит:

?- X = 3. 
X = 3. 

Наверное, ничего удивительного в этом.

?- 3 = X. 
X = 3. 

Объединение отличается от назначения. Как вы можете видеть, это не направленно. Эта строка не работала бы на каком-либо другом языке.

?- X = [1,Y,3]. 
X = [1, Y, 3]. 

Обратите внимание, что в Prolog нет проблем с наличием переменных.

?- X = [1,Y,3], Y = 2. 
X = [1, 2, 3], 
Y = 2. 

Теперь, потому что Y является одинаковым в обоих положениях, когда вы связаны Y 2, среднее значение в X стал 2, а также. Для Prolog существуют уникальные структуры данных, которые используют эту функцию (списки различий).

?- X = [1,Y,3], Q = X, Q = [1,2,3]. 
X = Q, Q = [1, 2, 3], 
Y = 2. 

Теперь то, что делает это интересным является то, что мы не в явном виде указать Пролог, что Y = 2. Пролог вывод это путем объединения. Вы можете увидеть еще несколько примеров, которые здесь:

?- X = [H|T], H = 3, T = [4,5]. 
X = [3, 4, 5], 
H = 3, 
T = [4, 5]. 

Итак, здесь мы уже говорили, X состоит из Н и Т, а затем сказал ему, что Н и Т. Но объединение Prolog не очень заботится о том, что вы делаете:

?- X = [H|T], X = [1,2,3]. 
X = [1, 2, 3], 
H = 1, 
T = [2, 3]. 

Объединение транзитивно.

Итак, что происходит, когда Prolog не может объединиться?

?- X = [1,Y,3], Q = X, Q = [1,2,3], Y = 4. 
false. 

Y должен быть 2 для первого шага, но для последнего шага он должен быть 4. Как только переменная привязана, ее не меняют. Это всего лишь более сложный способ сказать:

?- X = 2, X = 4. 
false. 

Пролог не имеет «назначений», просто переменных.

+0

Можете ли вы привести пример того, что вы сказали: «Но если кто-либо из них не имеет земли, он примет значение другого»? Моя проблема в основном это, мне нужно, чтобы L1 был изменен, потому что я обновляю свой лоток (или доску, я не знаю). Это военная битва – Marcio

+1

@Marcio в Prolog нет модифицирующих переменных –

+0

@Marcio Я немного поработал, см. Обновленный ответ. –

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