首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog检测列表中的变化

Prolog检测列表中的变化
EN

Stack Overflow用户
提问于 2014-10-21 09:52:58
回答 1查看 46关注 0票数 0

我想编写一个谓词find_difference([A|B],[P|Q],[C-D|E-F])来查找列表[A|B][P|Q]之间的区别,并给出类似于[C-D|E-F]的结果,C表示更改发生在第N个子列表中,而D则告诉更改发生在该子列表的第N个元素(每个子列表中的更改只会是一个字符)。因此,查询和预期结果如下:

代码语言:javascript
复制
find_difference([[a,b,c],[w,t]],[[a,b,d],[w,s]],X).
X=[1-3,2-2].

谓词也能处理变量吗?例如:

代码语言:javascript
复制
find_difference([[A,B,C],[A,D]],[[A,D,C],[A,S]],X).
X=[1-2,2-2].

谢谢您能提供的任何帮助。

代码语言:javascript
复制
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)
    ).

我现在只能设法得到列表的不同值。但是,如果这两份清单是相同的,那将是一个错误的答案。而且,它不能处理变量。

代码语言:javascript
复制
7 ?- find_difference([A,B,C],[A,B,D],X).
C = D,
X = 4.

为什么会这样呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-21 13:53:54

下面是一个实现:

代码语言:javascript
复制
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“列表中。

在第三和第四子句中,增加当前列并继续递归。

示例:

代码语言:javascript
复制
?- find_difference([[a,b,c],[w,t]],[[a,b,d],[w,s]],X).
X = [1-3, 2-2]

第二个示例(使用未实例化的变量)不会产生您期望的结果:

代码语言:javascript
复制
?- find_difference([[A,B,C],[A,D]],[[A,D,C],[A,S]],X).
B = S,
D = S,
X = [] ;

因为你可以把B和D和S结合起来,做那个do匹配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26483806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档