2011-05-28 72 views
1

我有研討會論文,我必須找到一些操作帶套在Prolog的,例如用於集:操作帶套在序言

subset([],V). 
subset([H|T1],[H|T2]):-subset(T1,T2). 
subset([H1|T1],[H2|T2]):- lt(H2,H1),subset([H1|T1],T2). 

我有發現他們中的一些麻煩,所以我會如果有人寫下來,非常感謝:

  • 檢查是否元素設置
  • 檢查的成員,如果設置爲空,EL 在定數
  • 檢查,如果集合的所有EL都是 數字
  • 檢查,如果兩套都是一樣的

回答

2

退房在SWI-Prolog的手冊中的部分library(lists): List Manipulation。嘗試列出的特定於集合的謂詞,並使用listing/1(例如,

?- listing(subset). 
lists:subset([], _) :- !. 
lists:subset([A|C], B) :- 
    memberchk(A, B), 
    subset(C, B). 

集被表示爲列表,所以要檢查成員使用member/2,檢查一組是空的,檢查它是否與空列表相結合。爲了檢查組的元素的性質,例如是否所有的號碼,你可以使用maplist:如果他們是彼此的子集

?- maplist(number, [1, -1.2, 0]). 
true. 

兩套是等價的。

1

在Prolog中,set通常用list來表示。所以你的第一個列表操作是列表中的member/2謂詞,第二個是簡單地檢查該集合是否爲空列表。一些重要的集合論操作是:組A的

  • 工會並設置B:得到含有無論是在A或B中
  • 元件
  • A的交點和B的一組:給予一組含有A和B中的元素
  • A的差和B:得到含有在A和未在B.
  • 元件

其中一些的一組操作是標準操作,例如,union/3intersection/3的描述在Kaarel的鏈接中。關於set操作及其在Prolog中的實現的一些很好的討論可以在這裏找到:http://kti.mff.cuni.cz/~bartak/prolog/sets.html