簡體   English   中英

如何獲得列表方案和序言的第一個,中間和最后一個元素?

[英]How to get the first, middle and last element of a list scheme and prolog?

我正在嘗試在Scheme和Prolog中編寫一個函數,該函數返回列表的第一,中間和最后一項。 例如, find([4,5,8,7,9],L), L = [4,8,9]

我想出了這段用於Scheme語言的代碼,但是我對Prolog並不陌生,也不了解很多,那么如何在Prolog中獲得相同的結果?

(define (frst L)
   (car L))

(define (last L)
   (if (null? (cdr L))
       (car L)
       (last (cdr L))))

(define (nth L x)
   (if (= x 1)
       (car L)
       (nth (cdr L) (- x 1))))

(define (firstMidLast L)
   (list (frst L)
         (nth L (ceiling (/ (length L) 2)))
         (last L)))

這是另一種方法!

  • “技巧”就是以兩種不同的速度走下相同的清單。
  • 第一個參數索引使目標list_first_mid_last(+,?,?,?)確定性。

我們像這樣定義list_first_mid_last/4

list_first_mid_last([E|Es],E,M,L) :-
    ahead_of_mid_last([E|Es],[E|Es],M,L).

ahead_of_mid_last([],[M|_],M,M).
ahead_of_mid_last([F|Fs],Es,M,L) :-
   more_ahead_of_mid_last(Fs,F,Es,M,L).

more_ahead_of_mid_last([],L,[E|_],E,L).
more_ahead_of_mid_last([F|Fs],_,Es,E,L) :-
   evenmore_ahead_of_mid_last(Fs,F,Es,E,L).

evenmore_ahead_of_mid_last([],L,[E|_],E,L).
evenmore_ahead_of_mid_last([F|Fs],_,[_|Es],M,L) :-
    more_ahead_of_mid_last(Fs,F,Es,M,L).

讓我們運行一些查詢,並將Prolog 1和Scheme 2的結果並排放置!

%  Prolog                                     % ; Scheme
?- list_first_mid_last([1],F,M,L).            % > (firstMidLast `(1))
F = M, M = L, L = 1.                          % (1 1 1)
                                              %
?- list_first_mid_last([1,2],F,M,L).          % > (firstMidLast `(1 2))
F = M, M = 1, L = 2.                          % (1 1 2)
                                              %
?- list_first_mid_last([1,2,3],F,M,L).        % > (firstMidLast `(1 2 3))
F = 1, M = 2, L = 3.                          % (1 2 3)
                                              %
?- list_first_mid_last([1,2,3,4],F,M,L).      % > (firstMidLast `(1 2 3 4))
F = 1, M = 2, L = 4.                          % (1 2 4)
                                              %
?- list_first_mid_last([1,2,3,4,5],F,M,L).    % > (firstMidLast `(1 2 3 4 5))
F = 1, M = 3, L = 5.                          % (1 3 5)
                                              %
?- list_first_mid_last([1,2,3,4,5,6],F,M,L).  % > (firstMidLast `(1 2 3 4 5 6))
F = 1, M = 3, L = 6.                          % (1 3 6)
                                              %
?- list_first_mid_last([1,2,3,4,5,6,7],F,M,L).% > (firstMidLast `(1 2 3 4 5 6 7))
F = 1, M = 4, L = 7.                          % (1 4 7)

腳注1:使用 7.3.11版(64位)。
腳注2:使用解釋器SCM版本5e5(64位)。

假設在列表中有偶數個項目的情況下,您可以選擇其中一個(在本例中為第一個),則此過程應起作用:

根據用戶“重復”的評論進行編輯(我不熟悉Scheme)

find([First|List], [First, Middle, Last]):-
  append(_, [Last], [First|List]),
  length(List, Length),
  NLength is Length >> 1,
  nth0(NLength, [First|List], Middle).

子句的開頭實例化列表的第一項,然后append/3接受最后一項, length/2計算列表的大小-1, >>/2將其大小除以2, nth0/3將得到中間項目。

暫無
暫無

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

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