查找出现在 Prolog 中相同位置的两个列表之间的公共元素
Finding common elemnts between two lists occuring at the same positions in Prolog
我正在使用 Prolog,我正试图找到一种方法来实现一个谓词,在该谓词中,它将两个列表作为参数,returns一个包含它们之间位于相同位置的公共元素的列表在两个列表中。
谓词如下:
correct_positions(List1, List2,R):如果 R 是包含字母的列表,则成功
出现在 List1 和 List2 的相同位置。
示例:
?- correct_positions([h,e,l,l,o],[h,o,r,s,e],R).
R=[h];
false.
上例中的字母“h”在两个列表中均位于第1位,因此应将其添加到R(结果列表)中。字母“e”和“o”也出现在两个列表中,但它们出现的位置不同,因此不会添加到结果列表中。
另一个例子:
?- correct_positions([o,r,l,l,a],[l,o,r,l,a],R).
R=[l,a];
false.
在前面的例子中,字母“l”在两个列表中都出现了两次,但也只会将出现在第 4 个位置的出现添加到结果中(因为它在两个列表中都出现在相同的位置)作为两个列表中第 5 个位置的字母“a”。 (字母“r”和“o”也出现在两个列表中。但是,它们不在相同的位置,因此不会添加到结果列表中。
假设相同长度的输入列表,可能的解决方案如下:
correct_positions([], [], []).
correct_positions([X|A], [X|B], [X|C]) :-
correct_positions(A, B, C).
correct_positions([X|A], [Y|B], C) :-
dif(X, Y),
correct_positions(A, B, C).
示例:
?- correct_positions([h,e,l,l,o], [h,o,r,s,e], R).
R = [h] ;
false.
?- correct_positions([o,r,l,l,a], [l,o,r,l,a], R).
R = [l, a] ;
false.
?- correct_positions([X,r,l,l,a], [l,o,r,l,a], R).
X = l,
R = [l, l, a] ;
R = [l, a],
dif(X, l) ;
false.
备注处理不同长度的输入列表,需要泛化base case
correct_positions([], [], []). % lists of the same length
correct_positions([], [_|_], []). % first list is the shortest
correct_positions([_|_], [], []). % first list is the longest
correct_positions([X|A], [X|B], [X|C]) :-
correct_positions(A, B, C).
correct_positions([X|A], [Y|B], C) :-
dif(X, Y),
correct_positions(A, B, C).
我正在使用 Prolog,我正试图找到一种方法来实现一个谓词,在该谓词中,它将两个列表作为参数,returns一个包含它们之间位于相同位置的公共元素的列表在两个列表中。
谓词如下:
correct_positions(List1, List2,R):如果 R 是包含字母的列表,则成功 出现在 List1 和 List2 的相同位置。
示例:
?- correct_positions([h,e,l,l,o],[h,o,r,s,e],R).
R=[h];
false.
上例中的字母“h”在两个列表中均位于第1位,因此应将其添加到R(结果列表)中。字母“e”和“o”也出现在两个列表中,但它们出现的位置不同,因此不会添加到结果列表中。
另一个例子:
?- correct_positions([o,r,l,l,a],[l,o,r,l,a],R).
R=[l,a];
false.
在前面的例子中,字母“l”在两个列表中都出现了两次,但也只会将出现在第 4 个位置的出现添加到结果中(因为它在两个列表中都出现在相同的位置)作为两个列表中第 5 个位置的字母“a”。 (字母“r”和“o”也出现在两个列表中。但是,它们不在相同的位置,因此不会添加到结果列表中。
假设相同长度的输入列表,可能的解决方案如下:
correct_positions([], [], []).
correct_positions([X|A], [X|B], [X|C]) :-
correct_positions(A, B, C).
correct_positions([X|A], [Y|B], C) :-
dif(X, Y),
correct_positions(A, B, C).
示例:
?- correct_positions([h,e,l,l,o], [h,o,r,s,e], R).
R = [h] ;
false.
?- correct_positions([o,r,l,l,a], [l,o,r,l,a], R).
R = [l, a] ;
false.
?- correct_positions([X,r,l,l,a], [l,o,r,l,a], R).
X = l,
R = [l, l, a] ;
R = [l, a],
dif(X, l) ;
false.
备注处理不同长度的输入列表,需要泛化base case
correct_positions([], [], []). % lists of the same length
correct_positions([], [_|_], []). % first list is the shortest
correct_positions([_|_], [], []). % first list is the longest
correct_positions([X|A], [X|B], [X|C]) :-
correct_positions(A, B, C).
correct_positions([X|A], [Y|B], C) :-
dif(X, Y),
correct_positions(A, B, C).