簡體   English   中英

如何在序言中定義差異列表

[英]How to define difference-list in prolog

使用差異列表,如何通過將前兩個元素移動到列表末尾來旋轉給定列表,使 [a,b,c,d] 變為 [c,d,a,b]。

如果為您提供了差異列表,則可以使用:

?- L = [a,b,c,d,e,f|R], L = [H1, H2|T], R = [H1, H2].
T = [c,d,e,f,a,b].

作為 DCG(比差異列表更人性化),在 swi-prolog 中:

% For remainder/1
:- use_module(library(dcg/basics)).

% Show lists of codes nicely
:- portray_text(true).

rotate2, Rem, [E1, E2] --> [E1, E2], remainder(Rem).

結果 swi-prolog:

?- phrase(rotate2, `abcdef`, R).
R = `cdefab`.

或者,如果您還需要尾巴:

rotate2_tail([A, B|T]) --> T, [A, B].
?- phrase(rotate2_tail(`abcdef`), L, R).
L = `cdefab|R`.

作為第三種方法(請注意,問題中沒有指定實際差異列表):

?- L = [a,b,c,d,e,f], L = [H1, H2|T], append(T, [H1, H2], L2).
L2 = [c,d,e,f,a,b].

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM