Prolog-使用列表解决问题

Prolog-使用列表解决问题,prolog,Prolog,你好,我必须用列表解决一些prolog问题,但我不知道这些是如何工作的。 我必须在列表中的每个偶数元素后面加上“1”,并对两个列表进行区分。 我知道这似乎很容易,用java或c等其他语言,我会让它变得很容易,但prolog让我头疼。 请帮助我:|编辑以注意澄清的问题陈述(“偶数项”表示该项的值为偶数(而不是该项在列表中的顺序位置): 对于第二个问题,即产生两个列表之间的差异,您是在讨论集合差异吗?如果是,给定两个集合A和B,您是在讨论相对差异(A中不存在于B中的所有元素)还是绝对差异(A或B中不

你好,我必须用列表解决一些prolog问题,但我不知道这些是如何工作的。 我必须在列表中的每个偶数元素后面加上“1”,并对两个列表进行区分。 我知道这似乎很容易,用java或c等其他语言,我会让它变得很容易,但prolog让我头疼。
请帮助我:|

编辑以注意澄清的问题陈述(“偶数项”表示该项的值为偶数(而不是该项在列表中的顺序位置):

对于第二个问题,即产生两个列表之间的差异,您是在讨论集合差异吗?如果是,给定两个集合A和B,您是在讨论相对差异(A中不存在于B中的所有元素)还是绝对差异(A或B中不存在于两个集合中的所有元素)

要解决相对集差异问题(查找B中不存在的A的所有成员),可以使用内置的
member/2
谓词:

relative_difference( [] , _ , [] ) .          % if the source list is exhausted, we're done
relative_difference( [A|As] , Bs , R ) :-     % if the source list is non-empty, and
  member(A,Bs) ,                              % - the current A is an element of B,
  ! ,                                         % - we insert a deterministic cut (no backtracking)
  relative_difference( As , Bs , R )          % - and recurse down, discarding the current A
  .                                           %
relative_difference( [A|As] , Bs , [A|R] ) :- % if the source list is non-empty (and A is not an element of B due to the cut inserted earlier)
  relative_difference( As , Bs , R )          % we simply add A to the result list and recurse down.
  .
这里需要注意的一点是:在所有这些示例中,我们构建的结果列表都是从一个变量构建的。列表的尾部是未绑定的(并作为新结果传递给下一个递归调用,在该调用中,它要么成为新的列表节点,要么在最后成为空列表)

这具有以下效果:

  • 按顺序(而不是相反顺序)构建列表
  • 如果结果是在初始调用上绑定的,那么随着递归的进行,将逐项实现与预期结果的统一,这意味着
  • 当第一次统一失败时,执行被短路
如果您的prolog实现没有内置的
member/2
,那么实现起来就足够容易了

member(X,[X|T]) :- ! .           % A hit! cut and succeed.
member(X,[_|T]) :- member(X,T) . % ... and a miss. Just recurse down on the tail.

对于第一个问题:你必须把1加到一个数字上,还是必须把“1”加到一个字符串上。你的列表元素的类型是什么?对于第二个问题:你如何定义两个列表之间的“差异”呢?你的意思是a-B=C(a,B,C是列表),其中C[i]=a[i]-B[i]?对我来说,在编写Prolog时,首先考虑用自然语言形式定义所需内容的规则是很有帮助的。通常,规则不止一个。例如,“在空列表中的每个偶数元素后插入1的结果是…”(在这里,您可以指出是要
[1]
还是
[]
。然后,您可能会有另一条规则,根据列表的头和尾(
[H|T]
)或可能是头和尾的两个元素(
[H1,H2|T]
)给出所需内容的递归定义。然后将自然语言翻译成Prolog语句。第一个示例:[4,3,5,7,2,6,3]->[4,3,1,5,1,7,1,2,6,3,1]及其区别:A=[3,4,5,6,7],B=[4,7]->C=[3,5,6]你的例子在每一个奇怪的元素后面都插入一个
1
。这是你想要的吗?这似乎是一个课堂作业。很抱歉看起来像一个无聊的老人,但在做作业之前,我建议你先阅读你的课程笔记,试着理解你的教授已经给你的简单的例子。谢谢,但是可以你能告诉我你在那里做了什么吗?你在哪里检查了nr.是否为偶数?对于第二个,我指的是相对数difference@jojuk:请看我修改后的答案。非常感谢!它真的帮助了我!在第二个答案中,它给了我一个错误。如果我声明为“成员”在谓词部分,它说我没有该谓词的子句,如果我没有声明它,它说它是未声明的。我该怎么办?
member(X,[X|T]) :- ! .           % A hit! cut and succeed.
member(X,[_|T]) :- member(X,T) . % ... and a miss. Just recurse down on the tail.