2011-07-27 75 views
1

我試圖找到列表中最小元素的索引位置,並在對應索引位置處打印元素在另一個列表中。在列表中找到最小元素的索引並在Prolog的另一個列表中找到對應索引位置的元素

例如:

?- min2(X,Y,[a,b,c],[5,3,7]). 
X= b 
y= 3 

代碼:

min2(A,B,[A|_],[B|_]). 
min2(A,B,[X|T1],[Y|T2]) :- smallest(W,[Y|T2]), % using a predicate to find the min element in the list 
          B is W,    % setting B to the result of above(i.e the min element) 
          min2(A,B,T1,T2).  % looking up position corresponding to min element in list1 

在列表中找到的最小元素的謂詞是:

smallest(Head, [Head]). 
smallest(Element, [Head|Tail]) :- smallest(E, Tail), Head =< E, Element is Head. 
smallest(Element, [Head|Tail]) :- smallest(E, Tail), E < Head , Element is E. 

我得到的結果是:

X = a, 
Y = 5 ; 
X = b, 
Y = 3 ; 
false. 

它也以某種方式選擇第一個元素。我的基本情況可能是錯的?我嘗試將基本情況更改爲min2(A,B,[A|_],[B|_]).,並中斷。

請告訴我我要出錯的地方。

回答

2

由於您第一次寫入事實(A,B,[A|_],[B|_]).它首先返回2列表的頭元素。 您需要修剪列表的頭部,直到第二個列表的頭部等於B.只要您發現list2的頭部等於B,就需要返回list1的頭部。

也許你想試試這個:

min2(A,B,[A],[B]). %base case 
min2(A,B,[X|T1],[Y|T2]) :- smallest(W,[Y|T2]), B is W, min2(A,B,T1,T2), !. 
min2(A,B,[H1|T1],[H2|T2]):- B=:=H2 -> A = H1 ; min2(A,B,T1,T2). 

不能嘗試一下(因爲目前工作IM)。但我認爲這應該是這樣的。

+0

謝謝你的答覆。 我得到'ERROR:=:=/2:參數沒有被充分實例化' B =:= H2-> A實際上做了什麼? =:=是數字相等,但什麼是 - >? – Bharat

+1

這是一個if語句a - > b; c意味着如果a是真的,那麼b否則c。 mmmh可能需要使用模式匹配而不是B =:= H2 – bliss

+0

哦,並且您需要編寫第二種情況,即在第二種情況後寫入的第二種情況。我認爲這就是爲什麼會出現錯誤。順序是:我的基例|你的第二個例子(謂詞)|我的第二個案例(謂詞)。因爲B在你的謂詞中被實例化 – bliss

0

爲了讓你的小東西多了,相反的順序我的最小的定義,就像min_list:

smallest([A], A). 
smallest([A, B|C], D) :- A > B, smallest([B|C], D), !. 
smallest([A, _|B], C) :- smallest([A|B], C). 

簡單,我認爲(和你也複製,而不是你自己的代碼)。相應的謂詞是,就像我張貼在DaniWeb:

corresponding(A, B, [A|_], [B|_]). 
corresponding(A, B, [_|C], [_|D]) :- 
    corresponding(A, B, C, D). 

通過自我明顯最小的規則結合這些,你會得到你的MIN2謂語。我的意思是,你是方式過於複雜的東西

+0

這不是我的。我曾說過我「找到了」一種解決方法:D我將繼續討論daniweb。 – Bharat

相關問題