2017-07-15 36 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