【问题标题】:Prolog , check if a pair of elements appears in a listProlog ,检查一对元素是否出现在列表中
【发布时间】:2017-09-24 14:09:04
【问题描述】:

给定一个列表L,我想看看列表中是否出现一对P。如果找到该元素,则打印*Found*

例如:

L = [3,1,2,5,4,7].
P = (2,5).

在这个例子中,我应该得到*Found*,因为2,5 出现在列表L 中的第二和第三位置。

这是我的方法,但我得到了一个错误的答案。

search_pair([_|[]],_).
search_pair([X|T],(F,L)) :-
   first(Y, T),
   write('searching: '),write(F),write(' '),write(L),nl,
   write('trying: '),write(X),write(' '),write(Y),nl,
   ((F == L , L = Y) -> (write('Found'))
   search_pair(T,(F,L),R).

【问题讨论】:

  • 我正在寻找连续的一对,就是这个:/
  • 第 6 行有语法错误,缺少右括号和逗号。此外,'first' 没有定义,我假设你的最后一行应该调用 search_pair/2 而不是 search_pair/3,这也是未定义的
  • 这比你做的要容易得多。您可以将至少包含两个元素的列表描述为[X, Y | T],其中T 是列表的其余部分(可能为空[])。除第一个元素外,该列表的其余部分是[Y | T]
  • 不要将副作用与实际程序逻辑混为一谈。

标签: list if-statement search prolog


【解决方案1】:

实际的关系很容易描述。有两种情况:

  • 案例 1:列表以给定对开头。在这种情况下,我们就完成了。

  • 案例2:否则我们需要在列表的尾部继续搜索。

这可以用if_/3(',')/3这样写:

pair_in((X,Y),[A,B|Cs]) :-
   if_((X=A,Y=B),
       true,                    % <- case 1
       pair_in((X,Y),[B|Cs])).  % <- case 2

用你的例子和反例来查询这个:

   ?- pair_in((2,5),[3,1,2,5,4,7]).
yes
   ?- pair_in((2,4),[3,1,2,5,4,7]).
no

如果您想在成功的情况下输出消息*Found*,我建议将其重新定位到调用谓词,例如你的谓词search_pair/2:

search_pair(L,P) :-        % <- calling predicate
   pair_in(P,L),           % <- actual relation
   format('*Found*~n').    % <- output

现在让我们用上面的例子来查询这个谓词:

   ?- search_pair([3,1,2,5,4,7],(2,5)).
*Found*
yes
   ?- search_pair([3,1,2,5,4,7],(2,4)).
no

如您所见,*Found* 仅在成功的情况下显示。这是因为万一目标pair_in(P,L) 失败,Prolog 不会继续下一个目标,因为规则不再为真。

【讨论】:

  • OP 询问“如果”,可能意味着if_
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多