このディレクトリの索引
#  以下の引用は笹川さんのプログです。
#  http://scmblog.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/prolog%E3%82%AA%E3%82%B8%E3%82%B5%E3%83%B3%E3%81%AB%E6%8D%A7%E3%81%90
#  
#  Prologオジサンに捧ぐ
#  私もProlog好きなオジサンなのですが、もうこれはすごいってくらいの筋金入りのPrologオジサンがいます。
#  
#  昭和57年頃に第五世代コンピューター計画というものがありまして、大規模な国家プロジェクトでした。そこで採用されたベースになる言語がPrologでした。私は、ひどく知的ショックを受けました。なぜLispやSchemeに手を伸ばしたかというとすべてはPrologを理解し、動かすためでした。
#  
#  NormalにはPrologの拡張機能があります。VMにWAM(ウォーレンさんの抽象マシン)を参考にしたProlog用の命令が含まれています。まだまだ改良の余地があるのですが、おおよその動作はするようになっています。
#  
#  例えば
#  
#  (assert (&subset () ()))
#  (assert (&subset (_f . _r) (_f . _s))
#          (&subset _r _s))
#  (assert (&subset (_f . _r) _s)
#          (&subset _r _s))
#  
#  これは集合の部分集合を求めるものです。
#  
#  こんな風に動作します。
#  
#  norm> (&subset (1 2 3) _x)
#  _x = (1 2 3)
#  ;
#  _x = (1 2)
#  ;
#  _x = (1 3)
#  ;
#  _x = (1)
#  ;
#  _x = (2 3)
#  ;
#  _x = (2)
#  ;
#  _x = (3)
#  ;
#  _x = ()
#  ;
#  #f
#  norm> 
#  
#  
#  竹内先生たちの開発したTAOがLispとPrologのハイブリッドでした。あちらはさらにオブジェクト指向まで取り込んでまさしく鵺のようでした。
#  
#  
#  PrologとSchemeは私にとってなくてはならない言語たちです。二つをうまく取り込めたことを自慢に思っています。
#  
#  どうぞ、Normalで遊んでください。Prologはとてもとても面白い言語です。
#  

subset([],[]).
subset([_f|_r],[_f|_s]) :-
        subset(_r,_s).
subset([_f|_r],_s) :-
        subset(_r,_s).


部分集合([],[]).
部分集合(L1,L2) :-
        第二要素以下による全ての部分集合候補の先頭に第一要素を付加する(L1,L2).
部分集合(L1,L2) :-
        先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る(L1,L2).

第二要素以下による全ての部分集合候補の先頭に第一要素を付加する([_第一要素|_第二要素以下],[_第一要素|_第二要素以下による全ての部分集合候補]) :-
        部分集合(_第二要素以下,_第二要素以下による全ての部分集合候補).

先頭要素を削り一要素少なくなった集合の全ての部分集合候補を得る([_|_一要素少なくなった集合],_一要素少なくなった集合の全ての部分集合候補) :-
        部分集合(_一要素少なくなった集合,_一要素少なくなった集合の全ての部分集合候補).