Prolog-使用列表解决问题
你好,我必须用列表解决一些prolog问题,但我不知道这些是如何工作的。 我必须在列表中的每个偶数元素后面加上“1”,并对两个列表进行区分。 我知道这似乎很容易,用java或c等其他语言,我会让它变得很容易,但prolog让我头疼。Prolog-使用列表解决问题,prolog,Prolog,你好,我必须用列表解决一些prolog问题,但我不知道这些是如何工作的。 我必须在列表中的每个偶数元素后面加上“1”,并对两个列表进行区分。 我知道这似乎很容易,用java或c等其他语言,我会让它变得很容易,但prolog让我头疼。 请帮助我:|编辑以注意澄清的问题陈述(“偶数项”表示该项的值为偶数(而不是该项在列表中的顺序位置): 对于第二个问题,即产生两个列表之间的差异,您是在讨论集合差异吗?如果是,给定两个集合A和B,您是在讨论相对差异(A中不存在于B中的所有元素)还是绝对差异(A或B中不
请帮助我:|编辑以注意澄清的问题陈述(“偶数项”表示该项的值为偶数(而不是该项在列表中的顺序位置): 对于第二个问题,即产生两个列表之间的差异,您是在讨论集合差异吗?如果是,给定两个集合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.
.
这里需要注意的一点是:在所有这些示例中,我们构建的结果列表都是从一个变量构建的。列表的尾部是未绑定的(并作为新结果传递给下一个递归调用,在该调用中,它要么成为新的列表节点,要么在最后成为空列表)
这具有以下效果:
- 按顺序(而不是相反顺序)构建列表
- 如果结果是在初始调用上绑定的,那么随着递归的进行,将逐项实现与预期结果的统一,这意味着
- 当第一次统一失败时,执行被短路
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.