【问题标题】:Last two elements of first list = first two elements of second list - Prolog第一个列表的最后两个元素=第二个列表的前两个元素 - Prolog
【发布时间】:2017-12-09 19:56:25
【问题描述】:

尝试为函数matchFirstTwo(List1, List2) 编写包含以下规则的 Prolog 规则,如果第一个列表的最后两个元素 = 第二个列表的前两个元素,则计算结果为 true。附加和反转无法在解决方案中实现。

last([X], X).
last([_|Z], X) :- last(Z, X).

nextToLast([X,_], X).
nextToLast([_|Z], X) :- nextToLast(Z, X).

写入matchFirstTwo(List1, List2) — 当List2 的第一个和第二个元素等于List1 的最后两个元素时成功

% Example :
?- matchFirstTwo([a,b,c,d],[d,c,a,b]).
   true.

【问题讨论】:

  • matchFirstTwo([a],[a]) 呢?
  • 它说List2's first and second element are equals btw 使用递归,当你达到 2 的长度时,然后简单地比较它们
  • @TomasBy:通过编辑,您会阻止其他编辑,因为审阅需要花费大量时间。在编辑帖子之前先获得 2k!

标签: prolog


【解决方案1】:

以下是我们如何使用广泛可用的列表谓词定义matchFirstTwo/2

matchFirstTwo(List1, List2) :-
   append([X,Y], _, List2),      % List2's first and second elements
   append(_, [Y,X], List1).      % equal List1's last two elements

或者,更简洁:

matchFirstTwo(List1, [Y,X|_]) :-
   append(_, [X,Y], List1).

或者,甚至更好:

matchFirstTwo(List1, [Y,X|_]) :-
   reverse(List1, [Y,X|_]).

示例查询:

?- matchFirstTwo([a,b,c,d], [d,c,a,b]).
true                                     % succeeds deterministically

【讨论】:

    【解决方案2】:

    继续删除第一个列表的头部,同时减少长度,如果长度为 2,则只需检查解决方案。

    没有append/3reverse/2

    matchFirstTwo(List1,List2):-
            length(List1,X),
            match(List1,X,List2).
    
    match(List1,2,List2):-
        compare(List1,List2),!.
    
    match([_|T],Len,List2):-
        NewLength is Len - 1,
        match(T,NewLength,List2).
    
    compare([H1,H2|_],[H1,H2|_]).
    

    您的示例查询有一个错误,因为您试图将第一个列表的最后两个元素与第二个列表的前两个元素进行比较。所以第二个列表必须有[c,d,a,b]才能得到真实。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多