Prolog列表操作功能

时间:2020-11-10 14:46:58

标签: prolog

我需要一些帮助来了解下面的函数在做什么?

func([], R, _, R).

func([_,_|F], [H|S], Pre, [Pre|B]) :-
    func(F, S, H, B).

1 个答案:

答案 0 :(得分:1)

此谓词作为辅助谓词可能最有用。它可用于删除列表的中间元素。请注意,只有具有奇数个元素的列表才具有中间元素。

如果我斜视,我可以在参数名称中看到一个“ F”和一个“ S”。那可以代表"Fast" and "Slow"吗?没有进一步的信息很难告诉。对于“ H air”和“ T ortuous”,这两个参数也可以分别命名为“ H”和“ T”,但这太混乱了,因为“ H “和“ T”通常代表“头”和“尾巴”,例如“野兔在咬自己的故事”。

但是首先,您需要添加使用此辅助谓词的实际谓词。我将其称为“有趣”,因为它比“ funk”少一个字母,并且每个人都喜欢玩得开心。 “ R”代表“结果”或“休息”,因为您在工作后可能需要休息一下才能获得结果。

fun([X|Xs], R) :-
    func(Xs, Xs, X, R).

func([], R, _, R).

func([_,_|F], [H|S], Pre, [Pre|B]) :-
    func(F, S, H, B).

现在您可以删除中间元素,或执行其他与此相关的事情:

?- fun([a,b,c], R).
R = [a, c].

?- fun([a], R).
R = [].

?- fun(L, [a,b]), numbervars(L).
L = [a, A, b] ;
false.

?- fun(L, [a|X]), numbervars(L-X).
L = [a, A, B],
X = [B] ;
L = [a, A, B, C, D],
X = [A, C, D] ;
L = [a, A, B, C, D, E, F],
X = [A, B, D, E, F] .

几乎忘了:看看this question,它似乎与您的问题有关。