我想编写一个谓词find_difference([A|B],[P|Q],[C-D|E-F])来查找列表[A|B]和[P|Q]之间的区别,并给出类似于[C-D|E-F]的结果,C表示更改发生在第N个子列表中,而D则告诉更改发生在该子列表的第N个元素(每个子列表中的更改只会是一个字符)。因此,查询和预期结果如下:
find_difference([[a,b,c],[w,t]],[[a,b,d],[w,s]],X).
X=[1-3,2-2].谓词也能处理变量吗?例如:
find_difference([[A,B,C],[A,D]],[[A,D,C],[A,S]],X).
X=[1-2,2-2].谢谢您能提供的任何帮助。
find_difference([],[],1).
find_difference([A|B],[C|D],E):-
( A=C ->
find_difference(B,D,Y),
E is Y+1
; find_difference(B,D,E)
).我现在只能设法得到列表的不同值。但是,如果这两份清单是相同的,那将是一个错误的答案。而且,它不能处理变量。
7 ?- find_difference([A,B,C],[A,B,D],X).
C = D,
X = 4.为什么会这样呢?
发布于 2014-10-21 13:53:54
下面是一个实现:
find_difference(LA, LB, LDiffs):-
find_difference(LA, LB, 1, 1, LDiffs).
find_difference([], [], _, _, []).
find_difference([[]|LA], [[]|LB], Row, _, LDiffs):-
succ(Row, NRow),
find_difference(LA, LB, NRow, 1, LDiffs).
find_difference([[Item|ATail]|LA], [[Item|BTail]|LB], Row, Col, LDiffs):-
succ(Col, NCol),
find_difference([ATail|LA], [BTail|LB], Row, NCol, LDiffs).
find_difference([[AItem|ATail]|LA], [[BItem|BTail]|LB], Row, Col, [Row-Col|LDiffs]):-
AItem\=BItem,
succ(Col, NCol),
find_difference([ATail|LA], [BTail|LB], Row, NCol, LDiffs).跟踪当前的“行”和“列”,并检查第一个列表中的每个项是否与第二个列表的项匹配。如果不匹配,则在第三个列表中添加位置。
find_difference/5的第一个子句是大小写(第一个和第二个参数上的空列表)。
第二句从一行转到下一行。
第三个子句检查第一个参数和第二个参数中的头列表的第一项是否统一,在这种情况下,您只需增加“列”。
Fourh子句检查它们是否不统一,因此您可以将当前行-Col添加到"output“列表中。
在第三和第四子句中,增加当前列并继续递归。
示例:
?- find_difference([[a,b,c],[w,t]],[[a,b,d],[w,s]],X).
X = [1-3, 2-2]第二个示例(使用未实例化的变量)不会产生您期望的结果:
?- find_difference([[A,B,C],[A,D]],[[A,D,C],[A,S]],X).
B = S,
D = S,
X = [] ;因为你可以把B和D和S结合起来,做那个do匹配。
https://stackoverflow.com/questions/26483806
复制相似问题