我试图写一条规则,检查一个列表是否是一个链,比如:
[5,2,2,4] -事实
[7,2,4,0] -假
[1,2] -假的单一元素列表也不是链。
因此,模式类似于[[a,b], [b,c], [c,d], ...] (内部列表总是包含两个元素和a,b,c,d中的任何一个元素)。可能相等)。
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.替换第二行,但是结果仍然一样。
我感谢任何帮助和解释。
发布于 2021-11-08 10:43:31
没有必要明确地失败。只要不为这种情况写规则,规则就会失败,因为它不能成功。
有一种方法可以做到:
chain([[_,X],[X,Y]|Rest]) :-
chain_1(Rest, Y).
chain_1([], _).
chain_1([[X,Y]|Rest], X) :-
chain_1(Rest, Y).这适用于你所有的角落案件吗?
这里没有什么要解释的。如果有些事情不明显,就问一些具体的问题。
因为对这些部分的最普遍的疑问有一定的痴迷,而且我是一个自然的人群快乐者,我会像罗马人那样做:
?- 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是列表中的左折叠,所以您可以将其写为:
chain([[_,X],[X,Y]|Rest]) :-
foldl(chain_rule, Rest, Y, _).
chain_rule([X,Y], X, Y).没有更多的可读性,但你可以向你的朋友炫耀。
https://stackoverflow.com/questions/69880541
复制相似问题