我是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
对我做错的任何帮助?
谢谢!
答案 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].
此解决方案还使用少一个变量。