Prolog 按邻接矩阵创建邻接列表

Prolog 按邻接矩阵创建邻接列表,prolog,Prolog,我需要写一个程序,根据图的表示,创建一个邻接列表,以邻接矩阵的形式给出 例子 输入-包含元素列表的列表 [[0,1,1],[1,0,1],[1,1,0]]. 输出 [[0,2,3],[1,0,3],[1,2,0]] 我试过这个: indexof(Index, Item, List):- nth1(Index, List, Item). replace(I, L, E, K) :- nth1(I, L, _, R), nth1(I, K, E, R). f([], []).

我需要写一个程序,根据图的表示,创建一个邻接列表,以邻接矩阵的形式给出

例子

输入-包含元素列表的列表

[[0,1,1],[1,0,1],[1,1,0]].
输出

[[0,2,3],[1,0,3],[1,2,0]]


我试过这个:

indexof(Index, Item, List):-
  nth1(Index, List, Item).

replace(I, L, E, K) :-
  nth1(I, L, _, R),
  nth1(I, K, E, R).

f([], []).
f([H|Tail], [Z|RezTail]):-
    member(E,H),
    E =:= 1,
    indexof(X, E, H),
    replace(X, H, X, Z),
    f(Tail, RezTail).
输入-
f([[0,1,1],[1,0,1],[1,1,0]],Z)。
输出-
Z=[[0,2,1],[1,0,1],[1,1,0]]


正如您所看到的,问题是在找到第一个“1”之后,程序进入递归并跳过列表中的更多项。有什么办法可以避免这种情况吗?

怎么样

fh([], [], _).
fh([0|T1], [0|T2], I) :-
  Ip is I+1,
  fh(T1, T2,Ip).
fh([_|T1], [I|T2], I) :-
  Ip is I+1,
  fh(T1, T2, Ip).


f([], []).
f([H1|T1], [H2|T2]) :-
  fh(H1, H2, 1),
  f(T1, T2).
因此:

评估结果为:

X = [[0, 2, 3], [1, 0, 3], [1, 2, 0]] 
怎么样

fh([], [], _).
fh([0|T1], [0|T2], I) :-
  Ip is I+1,
  fh(T1, T2,Ip).
fh([_|T1], [I|T2], I) :-
  Ip is I+1,
  fh(T1, T2, Ip).


f([], []).
f([H1|T1], [H2|T2]) :-
  fh(H1, H2, 1),
  f(T1, T2).
因此:

评估结果为:

X = [[0, 2, 3], [1, 0, 3], [1, 2, 0]] 

我不明白你的输入输出示例。输入列表的第三个元素是[0,0,1],这意味着第三个节点与第三个节点aka本身相邻?@damianodamiano是的,对不起,我只是随机双关了示例中的数字,我会修复它。但是整个想法都是一样的,我需要替换每个列表中的每个“1”到它的索引中,我不理解您的输入输出示例。输入列表的第三个元素是[0,0,1],这意味着第三个节点与第三个节点aka本身相邻?@damianodamiano是的,对不起,我只是随机双关了示例中的数字,我会修复它。但整个想法都是一样的,我需要替换每个列表中的索引中的每个“1”。哇,这是一个很好的解决方案。我想我对函数式编程语言有一个问题,因为我已经习惯了面向对象的语言,并尝试使用相同的方法。哇,这是一个很好的解决方案。我想我对函数式编程语言有一个问题,因为我习惯了面向对象的语言,并试图在这里使用相同的方法。