我正在尝试了解如何在序言中使用if语句或循环,但我无法获取它,因为存在很多不同的情况。java中的示例,如果您想说些可以轻松说的话{{1 }}。如果您想在if(x>=4) { } else if { }
之前执行循环操作。在序言中,有很多问题。让我清除一下。我看到一个练习,告诉我们有1个带数字的list1和2个列表,我的意思是(x>4)
。我应该做的是我必须创建一个新的list2,其中List1的所有数字都必须不超过10,但是在list2上每个数字应该出现两次。
解释需要进一步清除的内容,在list1中有一个数字可以说14,大于10,因此在list2中它必须是14,14。如何创建if语句,或像这样循环在列表上。已经读够了,但是这种语言至少对我来说是很奇怪的。例如,我已经学习过if语句,但在这种情况下我无法使用它。我在这里搜索过,但没有任何内容。通过给出良好的解释,可以在prolog中使用if语句和循环。在java中创建与if语句或循环“相似”的内容将有助于在prolog中开始的人更容易理解。原因是我在解决它时卡住了。
答案 0 :(得分:2)
我只是要发表评论,但评论变得冗长!
大多数Prolog初学者面临的最大问题是他们在思考“如何在Prolog中进行X就像在其他语言中进行X一样”。很多时候,这失败了,因为Prolog与其他语言完全不同。是的,您可以强制执行此操作,但最终会编写出质量很差的Prolog程序。相反,您需要考虑最初的问题,并根据Prolog的工作方式进行重铸。在Prolog中,您声明描述逻辑和算术关系的事实和规则(声明性),而不是使用步骤顺序(命令性)指导计算机做什么的函数。这不是Prolog的“问题”。问题是初学者不了解Prolog。
让我们开始用Prolog术语描述您的问题。您需要一个规则来描述列表之间的关系,其中第二个列表重复第一个列表中大于10的元素。让我们将关系称为dup_greater_than_10
。
基本情况很简单:空列表[]
是空列表的“大于10的重复”:
dup_greater_than_10([], []).
现在,您需要处理非空列表中的每个元素。 Prolog中的列表可以写为首尾(列表的其余部分):[X|Xs]
是一个列表,其第一个元素为X
,而“列表的其余部分”(结尾)是列表Xs
。
让我们为X
不大于10的情况写一条规则。在这种情况下,第二个参数的头应与第一个参数的头相同:
dup_greater_than_10([X|Xs], [X|Ys]) :-
X =< 10,
dup_greater_than_10(Xs, Ys).
此规则说,如果[X|Ys]
和列表[X|Xs]
是X =< 10
是列表Ys
的“大于10的两倍”版本列表Xs
中的“大于10的重复”。
现在,您需要规则X > 10
。我将对其进行描述,并将简单的Prolog的内容留给您:
[X,X|Ys]
是[X|Xs]
ifX > 10
的“ dup大于10”,列表Ys
是“ dup大于10”Xs
中的“”。
看看在列表的开头表示X
的重复有多么简单?在Prolog中,您可以编写一个列表:[X1, X2, ..., Xn|T]
,该列表以初始元素X1
,X2
,...,Xn
和尾部{{1} }。
所以您看到,当您问“我如何在Prolog中执行T
语句和if
时,您会问错一个问题。这就像在问:“我如何用扳手敲打指甲?”可以完成,但是效率低下,而且效果不佳。正确的问题是:“如何解决Prolog中的此类问题?”