2016-04-26 6 views
0

Я новичок в PROLOG и пробую несколько простых упражнений, чтобы ознакомиться с ним. Однако я застрял в добавлении 2x2matrix с другим, более конкретно списком в списках.PROLOG Logic Programm - добавление матрицы 2x2

Это мой код, выход с использованием SWI-Prolog False, и я понятия не имею, почему. Любая помощь приветствуется!

matrixAdd([X],[Y],[S]) :- S is X + Y. 
matrixAdd([[H|A],[I|B]],[[J|C],[K|D]],[[S1|Sum1],[S2|Sum2]]) :- 
    S1 = H + J, 
    S2 = I + K, 
    matrixAdd([A,B],[C,D],[Sum1,Sum2]). 
+1

Вы искусно использовали 'S is X + Y' в вашем базовом футляре, но забыли об этом во втором предложении: там у вас есть' S1 = H + J'. –

+0

@Boris Не могли бы вы подробно остановиться? – Logan

ответ

0

Сначала необходимо знать следующее:

  • Существует разница между = и is/2
  • Контрольного список вашего синтаксис [Head|Tail] отличается от [Element1,Element2]
  • унификации [X] только работу когда вы передаете список с ровно 1 элементом. Точно так же, как [[A,B],[C,D]] будет соответствовать только матрице 2 на 2. (Обратите внимание, что элементы A, B, .. может быть списки, а в этом случае)

Для вас жёстка решения, фиксируя все эти вопросы должны работать, но я хочу оставить, что вам сейчас ,

matrixAddHardcode([[A1,A2],[A3,A4]],[[B1,B2],[B3,B4]],[[S1,S2],[S3,S4]]) :- S1 is A1 + B1, S2 is A2 + B2, S3 is A3 + B3, S4 is A4 + B4.

решение для любого X на Y

matrixAddFix([],[],[]). matrixAddFix([L1|T1],[L2|T2],[S1|TS]) :- listSum(L1,L2,S1), matrixAddFix(T1,T2,TS). listSum([],[],[]). listSum([H1|T1],[H2|T2],[S1|TS]) :- S1 is H1+H2, listSum(T1,T2,TS).

1

развивавших:

?- 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([[],[]],[[],[]],[[],[]]). 

(так много списков!) и без какого-либо тела. Попробуйте заменить его в исходном коде и посмотрите, что произойдет.