2016-11-12 97 views
1

寫謂詞evenNumbers(L1,L2),如果包含隨機整數的列表L1 和列表L2包含來自L1的整數,則爲真。序言:查找偶數將它們添加到列表中

例如 ?-evenNumbers([2,1,-3,6,8,9],L2)。 »你的程序返回L2 = [2,6,8]。

我的代碼是:

evenNumbers([],[]). 
    evenNumbers([H|T],L):- 
     integer(H), 
     0 is H mod 2, 
     append([H],L,L); 
     evenNumbers(T,L). 
+0

我認爲它有問題,但你沒有解釋什麼。 –

+0

問題是這行:append([H],L,L); 但我不知道如何解決它沒有追加。 –

+0

查看密切相關的問題[Prolog Constraint編程查找偶數和奇數](http://stackoverflow.com/questions/21584521/prolog-constraint-programing-finding-even-and-odd-numbers)和[Sum of even ,在Prolog奇數的產品](http://stackoverflow.com/questions/32543847/sum-of-even-product-of-odd-numbers-in-prolog)和非常好的聲明[**第一個答案* *](http://stackoverflow.com/a/21607900/1613573)和[**第二個答案**](http://stackoverflow.com/a/32570620/1613573)。 – mat

回答

0

你的代碼有多種問題append([H],L,L);將停止遞歸,給你也是一個錯誤列表中的if-then-else語句是不對的。所以你可以寫:

evenNumbers([],[]). 
evenNumbers([H|T],L1):- 
     integer(H), 
     (H mod 2 =:=0 -> L1=[H|T1],evenNumbers(T,T1); 
     evenNumbers(T,L1)). 

例子:

?- evenNumbers([2,1,-3,6,8,9], L2). 
L2 = [2, 6, 8]. 

另一種方式寫這將是:

evenNumbers(L1,L2):-findall(X,(member(X,L1), X mod 2=:=0),L2). 
+0

很高興幫助! – coder

相關問題