0

我是 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

4 回答 4

4

从您的评论中,我了解到您误解了append(以及一般的 Prolog)是如何工作的。

这根本不是真的:“如果 B = [昨天] 和 H = [今天],那么 append(B, H, B) = [昨天,今天]”。

append(B, H, B)表示“将 H 附加到 B 再次产生 B”。这只有在 H 是一个空列表时才有可能。

要理解的关键是两个 Bappend(B, H, B)是相同的,它们必须具有相同的值。这就像代数中的变量——方程中的所有 X 表示相同的值。

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

于 2013-02-19T00:01:23.107 回答
1

你得到一个 no 因为 append(B,H,B) 失败,除非 H 是 []; 请记住,这些是从句,而不是赋值。而且由于您从不将任何内容绑定到 C,因此如果您的陈述被证明,它将永远不会有价值。

这将完成您的任务:

gothrough([],L,L).
gothrough([H|T], B, C) :- gothrough(T,B,Cx), append([H],Cx,C).
于 2013-02-18T23:24:53.373 回答
1

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

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

于 2013-02-18T23:22:27.450 回答
0

这可以更简单地完成:

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

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

The second rule matches everything but an empty list, in which case the head H is appended onto X, where X is the result of list obtained from recursing the tail. ie. you don't need to use the append predicate - list appending is built into prolog.

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

This solution also uses one less variable.

于 2013-02-21T18:23:31.803 回答