带有递归的Prolog if / else语句

时间:2013-02-18 23:13:36

标签: if-statement recursion prolog

我是prolog的新手,我正在试图找出如何使用if / else语句和递归。为了说明,我写了一个简单的prolog程序。该程序是无用的(因为它的功能是无用的),但它帮助我说明我的问题。程序采用一个列表,检查列表的头部,看它是否是最后一个元素;如果不是,它会将头添加到临时列表变量中,并使用列表的尾部以递归方式运行程序。它应该最后输出列表。该计划:

 gothrough([H|T], B, C):-
      append(B,H,B),
      (  (T == [])
      -> C=B
      ;  gothrough(T, B, C)
      ).

致电:gothrough([sample, phrase, here], [], C).

预期输出:C = [sample, phrase, here]

当前输出:no

对我做错的任何帮助?

谢谢!

4 个答案:

答案 0 :(得分:4)

根据您的评论,我理解您误解了append(和Prolog一般)的工作方式。

根本不是这样:“如果B = [昨天]而H = [今天],则追加(B,H,B)= [昨天,今天]”。

append(B, H, B)表示“将H追加到B再次产生B”。只有当H是空列表时才可以这样做。

要理解的关键是append(B, H, B)中的两个B都是相同的,它们必须具有相同的值。它就像代数中的变量 - 等式中的所有X都表示相同的值。

您应该为输出变量使用不同的名称,例如append(B, H, Bnew) - 然后它会更有意义。

答案 1 :(得分:1)

第一个问题是append(B, H, B),对大多数输入来说没有意义。

第二个问题是if-then-else的结果和替代,即->之后和;之后的部分必须都是Prolog目标(语句)。 C不是目标。你可能意味着C=B,虽然很难分辨,因为我发现很难理解你的程序在做什么。

答案 2 :(得分:1)

你得到一个no,因为追加(B,H,B)失败,除非H是[];记住,这些是条款,而不是作业。而且,既然你永远不会将任何东西绑定到C,那么如果你的陈述得到证实,它就永远不会有价值。

这将完成你的任务:

gothrough([],L,L).
gothrough([H|T], B, C) :- gothrough(T,B,Cx), append([H],Cx,C).

答案 3 :(得分:0)

这可以更简单地完成:

gothrough([], []).
gothrough([H|T], [H|X]) :-
    gothrough(T, X).

第一条规则匹配您的空列表条件,然后强制结束递归/列表的构建。

第二个规则匹配除空列表之外的所有内容,在这种情况下,头H被附加到X上,其中X是从递归尾部获得的列表的结果。即。你不需要使用append谓词 - 列表追加是内置于prolog中的。

?- gothrough([simple, phrase, here], X).
X = [simple, phrase, here].

此解决方案还使用少一个变量。