развивавших:
?- A = 2 + 3.
A = 2+3.
?- A = 2 + 3, A == 5.
false.
?- A = 2 + 3, A = 5.
false.
?- A is 2 + 3, A =:= 10/2.
A = 5.
?- A is 2 + 3, A = 10/2.
false.
Подумайте, почему вы получаете каждый из этих ответов.
Кроме того, подумайте о том, как вы хотите представить свою матрицу. Нужно ли быть вложенным списком? Например, это может быть что-то вроде matrix(dim(2,2), [1,2,3,4])
. Затем, добавив две матрицы будет столь же легко, как:
matrix_sum(matrix(D, V1), matrix(D, V2), matrix(D, Sum)) :-
maplist(add, V1, V2, Sum).
add(X, Y, Sum) :-
Sum is X + Y.
(Вы можете получить фантазии и использовать библиотеку ограничений для add
операции, например, с библиотекой (clpr) можно написать {Sum = X+Y}
и использовать тот же предикат. для того и для вычитания.)
Это использует объединение в голову, чтобы убедиться, что обе матрицы имеют одинаковые размеры, в то время как уход maplist
берут из V1
и V2
быть одинаковой длины.
Или вы предпочитаете список списков. Затем выясните общий предикат, который добавляет списки списков вместе (см. Другой ответ!). Теперь у вас странный микс, где вы заранее знаете величину одного измерения, но все же пытаетесь пересечь другое измерение. Поскольку ваш код в настоящий момент, ваш базовый случай всегда терпит неудачу. Оно должно быть:
matrixAdd([[],[]],[[],[]],[[],[]]).
(так много списков!) и без какого-либо тела. Попробуйте заменить его в исходном коде и посмотрите, что произойдет.
Вы искусно использовали 'S is X + Y' в вашем базовом футляре, но забыли об этом во втором предложении: там у вас есть' S1 = H + J'. –
@Boris Не могли бы вы подробно остановиться? – Logan