Пролог: матричные операции - PullRequest
0 голосов
/ 12 мая 2018

У меня нет большого опыта программирования в Прологе. Я борюсь с написанием правил для основных матричных операций. Поэтому мне нужны эти три операции для матрицы N:

size(+N,-Num): returns n if N is of size n x n
fetch(+N,+I,+J,-Value): returns the (I,J) value of N
store(+N,+I,+J,+Value,-NewN): replaces the (I,J) value of N

Например, у меня есть такая матрица:

[ [[b],[d,o],[m,o]],
  [[a],[oi,mi,d],[di,fi]],
  [[b],[d],[=]]         ]

Я надеюсь, что кто-нибудь может мне помочь, спасибо:)

EDIT: Я думаю, что я решил первые две операции. Здесь операция size(N,Num):

size2(N, Ls) :-
   length(Ls, N).

size1(Mss, R, C) :-
   length(Mss, R),
   maplist(size2(C), Mss).

size(N,M):-
   size1(N,R,C),
   R = C,
   M is R.

Здесь операция fetch(N,I,J,Value):

fetch(Mat, Row, Col, Val) :- 
    nth1(Row, Mat, ARow), nth1(Col, ARow, Val).

Но я не уверен, как написать операцию store(N,I,J,Value,NewN) ...

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете использовать nth1 / 4 (я связался с nth0 / 4, так как документы для этой записи явные), заменив и строку и элемент в ней, аналогичнотак, как вы использовали в своей загрузке / 4.Рассмотрим этот пример

?- L=[a,b,c],I=3,N=x, nth1(I, L, Old, Temp), nth1(I, R, N, Temp).
L = [a, b, c],
I = 3,
N = x,
Old = c,
Temp = [a, b],
R = [a, b, x].

В R у нас третий (I = 3) элемент заменен на L.

Итак, все, что вам нужно, это 4 раза вызвать nth1 вправильный порядок .Сначала вы выбираете строку, которую нужно изменить, затем применяете подстановку элемента, а затем повторно вставляете строку в матрицу.

Полученный код является, например, довольно общим (примечание I, J - здесь оно называется U, V - не указано):

?- store([[1,2,3],[3,4,5],[7,8,9]],U,V,x,R).
U = V, V = 1,
R = [[x, 2, 3], [3, 4, 5], [7, 8, 9]] ;
U = 1,
V = 2,
R = [[1, x, 3], [3, 4, 5], [7, 8, 9]] ;
U = 1,
V = 3,
R = [[1, 2, x], [3, 4, 5], [7, 8, 9]] ;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...