【问题标题】:Prolog's detecting change in listProlog 检测列表中的变化
【发布时间】:2014-10-21 21:53:54
【问题描述】:

我想写一个谓词find_difference([A|B],[P|Q],[C-D|E-F])来查找列表[A|B][P|Q]之间的区别,并给出类似[C-D|E-F]的结果,C表示变化发生在第N个子列表中,而@987654325 @ 表示更改发生在该子列表的第 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.

为什么会这样?

【问题讨论】:

  • 您声明的期望结果是一个列表,但您的实施尝试显然有一个整数结果 (E),而不是列表结果。
  • 你对差异的理解是什么?从你的问题中不清楚。而是说明不同之处。

标签: prolog


【解决方案1】:

这是一个实现:

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 子句检查它们是否不统一,因此您将当前的 Row-Col 添加到“输出”列表中。

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

例子:

?- 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 统一起来,所以确实匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多