2014-03-19 40 views
-1

作爲我正在編寫的程序的一部分,我需要確保變量不等於給定列表中2個數字相乘的結果。例如:我有一個列表Primes = [2,3,5,7,11],我需要確保X不等於這些數字中的任何兩個乘以一起,例如6(2 * 3)或55 (5 * 11)等...SWI-Prolog列表操作

我的代碼如下:

list(Numbers):- 
      Numbers = [X, Y, Sum], 
      between(3,6,Y), 
      between(3,6,X), 
      Primes = [2, 3, 5, 7, 11], 
      Sum is X+Y, 
      (Code i need help with) 

上述代碼家業類型超出[3,3,6-],[4,3,7結果],[5,3,8]等等。現在我想要的是能夠確定何時總和等於素數*素數,並從結果中排除。像Sum \ = prime * prime這樣的東西。但是,我不知道如何遍歷Prime中的元素,以便將兩個元素相乘,然後對列表中的所有元素執行此操作。

希望這是有道理的;我不擅長解釋事情。

在此先感謝。

回答

0

這是效率低下,而且容易代碼:

... 
forall((nth(I,Primes,X),nth(J,Primes,Y),J>I), Sum =\= X*Y). 

我想你可以使用該循環初始化的預先計算的因素列表,然後使用memberchk/2。

在SWI-Prolog中使用nth1/3而不是nth/3