首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规则的意外结果

规则的意外结果
EN

Stack Overflow用户
提问于 2021-11-08 08:29:59
回答 1查看 69关注 0票数 1

我试图写一条规则,检查一个列表是否是一个链,比如:

[5,2,2,4] -事实

[7,2,4,0] -假

[1,2] -假的单一元素列表也不是链。

因此,模式类似于[[a,b], [b,c], [c,d], ...] (内部列表总是包含两个元素和a,b,c,d中的任何一个元素)。可能相等)。

代码语言:javascript
复制
chain([]):-!.
chain([X]):-false.
chain([_|[]]):-!.
chain([[_, X2]|[[Y1, Y2]|Tail]]):-
    X2 == Y1,
    chain([[Y1, Y2]|Tail]).

有了-? chain([[1,2]]).,我得到了真实,这让我很困惑。

此外,我还尝试用chain(L):-length(L, Len),Len>1.替换第二行,但是结果仍然一样。

我感谢任何帮助和解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-08 10:43:31

没有必要明确地失败。只要不为这种情况写规则,规则就会失败,因为它不能成功。

有一种方法可以做到:

代码语言:javascript
复制
chain([[_,X],[X,Y]|Rest]) :-
    chain_1(Rest, Y).

chain_1([], _).
chain_1([[X,Y]|Rest], X) :-
    chain_1(Rest, Y).

这适用于你所有的角落案件吗?

这里没有什么要解释的。如果有些事情不明显,就问一些具体的问题。

因为对这些部分的最普遍的疑问有一定的痴迷,而且我是一个自然的人群快乐者,我会像罗马人那样做:

代码语言:javascript
复制
?- chain(X).
X = [[_, _A], [_A, _]] ;
X = [[_, _A], [_A, _B], [_B, _]] ;
X = [[_, _A], [_A, _B], [_B, _C], [_C, _]] ;
X = [[_, _A], [_A, _B], [_B, _C], [_C, _D], [_D, _]] .

凉爽的!

由于chain_1/2是列表中的左折叠,所以您可以将其写为:

代码语言:javascript
复制
chain([[_,X],[X,Y]|Rest]) :-
    foldl(chain_rule, Rest, Y, _).

chain_rule([X,Y], X, Y).

没有更多的可读性,但你可以向你的朋友炫耀。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69880541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档