反转列表时出现 prolog 空列表错误

发布于 2025-01-12 01:33:32 字数 521 浏览 0 评论 0原文

首先,我对 Prolog 很陌生,只是想了解最基本的知识。

我必须工作一个连接两个列表的简单函数和一个反转列表的函数。

这个实现:

cconcat([], L, L).
cconcat([H1|T1], L2, [H1|T2]) :- cconcat(T1, L2, T2).

revv([], []).
revv(R, [H|T]) :- revv(R1, T), cconcat(R1,[H],R).

效果很好,但是这个

cconcat([], L, L).
cconcat([H1|T1], L2, [H1|T2]) :- cconcat(T1, L2, T2).

revv(R, []) :- R is []. 
revv(R, [H|T]) :- revv(R1, T), cconcat(R1,[H],R).

给了我这个错误:类型错误:预期为“evaluable”,找到了“[]”

这是为什么?它们不是等价的吗?

First of all I'm very new to Prolog and just trying to understand the very basics.

I have to work a simple function that concatenes two lists and a function that reverses a list.

This implementation:

cconcat([], L, L).
cconcat([H1|T1], L2, [H1|T2]) :- cconcat(T1, L2, T2).

revv([], []).
revv(R, [H|T]) :- revv(R1, T), cconcat(R1,[H],R).

works well, but this one

cconcat([], L, L).
cconcat([H1|T1], L2, [H1|T2]) :- cconcat(T1, L2, T2).

revv(R, []) :- R is []. 
revv(R, [H|T]) :- revv(R1, T), cconcat(R1,[H],R).

gives me this error : Type error: `evaluable' expected, found `[]'.

Why is that? Aren't they equivalent?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

输什么也不输骨气 2025-01-19 01:33:32
R is [].

与此重写相同:

is(R, []).

is() 是为这种用途而设计的:

?- is(Answer, 4 + 2 * 3).
Answer = 10

is() 想要一些它可以评估的数学;这就是错误消息的含义,它不知道如何评估空列表。 R = [] 可以在那里工作,但你的第一个版本更好。

R is [].

is the same as this rewrite:

is(R, []).

is() was made for this kind of use:

?- is(Answer, 4 + 2 * 3).
Answer = 10

is() wants some math it can evaluate; that's what the error message means, it doesn't know how to evaluate an empty list. R = [] will work there, but your first version is better.

情独悲 2025-01-19 01:33:32

对于串联,有 3 种特殊情况:

  • 两个空列表的串联就是空列表本身:
    concatenate_lists( [] , [] , [] ) 。
    
  • 空列表和非空列表的串联是非空列表:
    concatenate_lists( [] , [Y|Ys] , [Y|Ys] ) 。
    
  • 非空列表和空列表的串联就是非空列表:
    concatenate_lists( [X|Xs] , [] , [X|Xs] ) 。
    

以及 2 个非空列表的一般情况,我们从左侧列表复制元素并向下递归(直到我们陷入终止递归的特殊情况):

concatenate_lists([X|Xs], [Y|Ys] , [X|Zs] ) :- concatenate_lists(Xs,[Y|Ys],Zs).

将所有这些放在一起,您会得到:

concatenate_lists( []     , []     , []     ) .
concatenate_lists( [X|Xs] , []     , [X|Xs] ) .
concatenate_lists( []     , [Y|Ys] , [Y|Ys] ) .
concatenate_lists( [X|Xs] , [Y|Ys] , [X|Zs] ) :- concatenate_lists(Xs,[Y|Ys],Zs) .

反转列表更容易。在这里,我们使用一个辅助谓词 reverse_list/3 ,它带有一个维护状态的额外参数:

reverse_list( Xs, Ys ) :- reverse_list( Xs, [] , Ys ) .

reverse_list( []     , Zs , Zs ) .  % if the source list is exhausted, we're done
reverse_list( [X|Xs] , Ys , Zs ) :- % otherwise, prepend the head of the source list to the accumulator
  reverse_list(Xs,[X|Ys],Zs) .      % and recurse down.
 

For concatenation, you have 3 special cases:

  • The concatenation of two empty lists is the empty list itself:
    concatenate_lists( [] , [] , [] ) .
    
  • The concatenation of the empty list and a non-empty list is the non-empty list:
    concatenate_lists( [] , [Y|Ys] , [Y|Ys] ) .
    
  • The concatenation of a non-empty list and the empty list is the non-empty list:
    concatenate_lists( [X|Xs] , [] , [X|Xs] ) .
    

And the general case of 2 non-empty lists, for which we copy elements from the left list and recurse down (until we collapse into a special case that terminates the recursion):

concatenate_lists([X|Xs], [Y|Ys] , [X|Zs] ) :- concatenate_lists(Xs,[Y|Ys],Zs).

Putting it all together you get:

concatenate_lists( []     , []     , []     ) .
concatenate_lists( [X|Xs] , []     , [X|Xs] ) .
concatenate_lists( []     , [Y|Ys] , [Y|Ys] ) .
concatenate_lists( [X|Xs] , [Y|Ys] , [X|Zs] ) :- concatenate_lists(Xs,[Y|Ys],Zs) .

Reversing a list is easier. Here, we use a helper predicate, reverse_list/3 that carries an extra argument that maintains state:

reverse_list( Xs, Ys ) :- reverse_list( Xs, [] , Ys ) .

reverse_list( []     , Zs , Zs ) .  % if the source list is exhausted, we're done
reverse_list( [X|Xs] , Ys , Zs ) :- % otherwise, prepend the head of the source list to the accumulator
  reverse_list(Xs,[X|Ys],Zs) .      % and recurse down.
 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文