kprolog K-Prolog Compiler Version 6.0

例題プログラム

リスト操作、集合操作の例題が、
   $PLC/sample/list.pl
   $PLC/sample/set.pl
にあります。 これらに含まれている述語は以下のものです。


list_top(X,N,L)
list_bottom(X,N,L)
list_copy(X,N,Len,L)
list_cut(X,N,Len,L)
list_paste(X,N,Y,L)
list_append(X,Y,L)
X
[+] リスト
N
[+] 位置(整数)
L
[-] 結果(リスト)
Len
[+] 長さ(整数)
top/3は、リストXの先頭N要素を取り出したリストをLに返します。
bottom/3は、リストXの末尾N要素を取り出したリストをLに返します。
copy/4は、リストXのN番めからLen要素を取り出したリストをLに返します。
cut/4は、リストXのN番めからLen要素を取り除いたリストをLに返します。
paste/4は、リストXのN番の要素の前にリストYを挿入したリストをLに返します。
append/3は、リストXとリストYを連結したリストをLに返します。
[例]

   list_top([a,b,c,d,e,f],3,L) --> L = [a,b,c]
   list_bottom([a,b,c,d,e,f],3,L) --> L = [d,e,f]
   list_copy([a,b,c,d,e,f],3,2,L) --> L = [c,d]
   list_cut([a,b,c,d,e,f],3,2,L) --> L = [a,b,e,f]
   list_paste([a,b,c,d,e,f],3,[x,y],L) --> L = [a,b,x,y,c,d,e,f]
   list_append([a,b,c],[x,y,z],L) --> L = [a,b,c,x,y,z]
[御注意]
copy/4,cut/4,paste/4は、Xの長さがNより小さい場合は失敗します。
copy/4,cut/4は、Lenが大き過ぎる場合には短く解釈します。

list_first(X,E,L)
list_nth(X,N,E)
list_last(X,E)
list_delete(X,E,L)
list_index(X,E,M)
list_isMember(X,E)
X
[+] リスト
E
[-] 要素(項)
L
[-] 残りのリスト
N
[+] 位置
M
[-] 位置
first/3は、リストXの最初の要素をEに、残りのリストをLに返します。
nth/3は、リストXのN番めの要素をEに返します。
last/3は、リストXの最後の要素をEに返します。
delete/3は、リストXから要素Eと同じものをすべて取り除いたものをLに返します。
index/3は、リストXの中での要素Eの出現位置をNに返します。 Eが出現しない場合は0を返します。
isMember/3は、リストXの中で要素Eが出現するかどうか調べ、 出現する場合に限り成功します。
   [例]

   list_first([a,b,c],E,L) --> E = a, L = [b,c]
   list_nth([a,b,c,d,e,f],4,E) --> E = d
   list_last([a,b,c,d,e,f],E) --> E = f
   list_delete([a,b,c,d,e,f],d,L) -->L = [a,b,c,e,f]
   list_index([a,b,c,d,e,f],d,N) -->N = 4
   list_isMember([a,b,c,d,e,f],d) -->true
   list_isMember([a,b,c,d,e,f],x) -->fail

list_sort(X,Comp,L)
list_sort(X,L)
list_merge(X,Y,L)
list_uniq(X,L)
list_reverse(X,L)
X
[+] リスト
Y
[+] リスト
Comp
[-] 比較述語
L
[-] 結果(リスト)
sort/3は、リストXをCompで指定する順序で昇順に並べ換えてLに返 します。Compは、第一引数と第二引数を比較して第二引数に与えた 項の方が"より大"である時に限り成功する述語でなければなりませ ん。
sort/2は、Xを標準順序(@>)で昇順にソートした結果をLに返します。

merge/3は、二つの標準順序でソートされたリストXとYをマージし ます。結果Lはソートされたリストになります。
uniq/2は、ソートされたリストXの同一の要素を一つにまとめたもの をLに返します。
reverse/2は、リストXを逆順に並べ換えたものをLに返します。

   [例]

   list_sort([p(c,3),p(b,2),p(a,4)],comp2(_,_),L) 
       --> L = [p(b,2),p(a,3),p(c,4)]
   ただし、
       :-public comp2/2.
       comp2(X,Y):-
          arg(2,X,A),arg(2,Y,B),
       A > B.                 % 第二引数で比較する。
   と定義されているものとします。
   list_sort([p(a,3),p(b,2),p(c,4)],L) 
       --> L = [p(b,2),p(a,3),p(c,4)]
   list_merge([a,b,d,e,e,f],[c,d,f,f],L) 
       -->L = [a,b,c,d,d,e,e,f,f,f]
   list_uniq([a,b,c,d,d,d,e,e,f],L) --> L = [a,b,c,d,e,f]
   list_reverse([a,b,c,d,e,f],L) --> L = [f,e,d,c,b,a]
[御注意]
Compはpublicな述語でなければなりません。
sort/3,sort/2は、sortと違って、同じ要素を一つにまと めません。

set_union(X,Y,S)
set_intersect(X,Y,S)
set_difference(X,Y,S)
set_isSubset(X,Y)
X
[+] 集合
Y
[+] 集合
S
[-] 結果(集合)
union/2は、集合XとYの和集合をつくってSに返します。
intersect/2は、集合XとYの積集合をつくってSに返します。
differnce/2は、集合XとYの差集合をつくってSに返します。
isSubset/2は、集合yが集合Xの部分集合であるかどうかを判定し、 部分集合でなければfailします。
   [例]

   set_union([a,c,e,f],[b,c,f,g],L) 
       --> L = [a,b,c,e,f,g]
   set_intersect([a,c,e,f],[b,c,f,g],L) --> L = [c,f]
   set_difference([a,c,e,f],[b,c,f,g],L) --> L = [a,e]
   set_isSubset([a,b,c,d,e,f],[b,c,f]) --> true
   set_isSubset([a,b,c,d,e,f],[b,c,g]) --> fail
[御注意]
このクラスのメソッドは、引数が正しく集合になっているかどうか を調べません。


目次に戻る