Я действительно не уверен, что вы» я пытаюсь сделать здесь, но могу указать на несколько которые поражают меня как симптомы недоразумения.
Прежде всего, вы связываете все переменные в верхней, а затем у вас есть по существу снизу из другого случая, который выглядит следующим образом:
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.
Пролог не имеет «назначений», просто переменных.
Что такое 'T'? Что такое 'E'? Вам нужно дать более подробную информацию о том, что вы хотите от этих предикатов. Некоторые примеры были бы хорошими. –
Прошу прощения.Я отредактирую вопрос – Marcio