2017-07-15 50 views
1

我正在嘗試開發一個prolog過程,它將使用univ(=..)將任何給定列表中的數字轉換爲它們的平方根列表。到目前爲止,我有在Prolog中使用univ運算符

convert(X,Y): number(X), Y is X^2. 
use([],_,[]). 
use([_|X],convert,L):- 
      convert(X,Y), 
      L =..[convert,X,Y]. 

這評估假,什麼可能是錯誤的我的邏輯或執行?

+0

錯字:convert(X,Y):number(X)...' - >'convert(X,Y): - number(X)...'。你是指平方根或正方形?你的代碼正在做廣場。你爲什麼使用'= ../2'?目的是提供術語和列表之間的等價關係。目前還不清楚你認爲這會如何解決你的問題。 – lurker

回答

2

有多個錯誤:

  • 爲什麼經過謂詞轉換/ 2的名字嗎?
  • 最重要的是我看不到遞歸調用!
  • 您可以通過編寫忽略列表的頭元素[_ | X],這意味着用頭元素和尾X.
  • 您嘗試使用轉換X上這是一個列表列表,並指定原子將(X,Y)轉換爲L.請注意,prolog不是一種過程式語言,convert(X,Y)只能通過調用convert(X,Y)才能起作用,並且結果將在Y中,因此無法進行分配像:L = convert(X,Y)這隻會分配到atom convert(X,Y) L.

你不需要操作者=..,作爲一個簡單的解決辦法是:

convert(X,Y):- number(X), Y is X^2. 
use([],[]). 
use([H|T],[Y|T1]):- 
      convert(H,Y), 
      use(T,T1). 
+0

你的代碼在第一行的':'後面缺少'-'。而使用/ 2的第一個目標應該是'convert(H,Y)'--) – tas

+0

@tas,謝謝!!!這些都是使用複製粘貼時的問題:)! – coder

+0

謝謝我將使用use,我不知道這個謂詞。 – user8291645

4

你也可以使用maplist/3定義use/2convert/2在您的文章中定義:

use(X,Y) :- maplist(convert, X, Y). 

    ?- use([1,2,3],L). 
L = [1,4,9] 

注意use/2簡直是失敗對於包含任何東西,但數字清單:

?- use([1,2,3,a],L). 
no 
+2

'convert/2' ...用'X = 2'成功轉換(X,2)',但'X = 2,轉換(X,2)'失敗。 – false

+0

@false:謝謝你指出。那個細節完全不顧我的注意。我刪除了錯誤的代碼。 – tas

+0

...但您需要將其替換爲一些正確的代碼... – false