在Prolog中使用univ运算符

时间:2017-07-15 12:19:13

标签: prolog

我正在尝试开发一个prolog程序,它将使用univ(=..)将任何给定列表中的数字转换为它们的平方根列表。到目前为止我已经

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

这会判断为false,我的逻辑或执行可能出错?

2 个答案:

答案 0 :(得分:4)

您还可以使用maplist/3定义use/2 convert/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

答案 1 :(得分:2)

有多个错误:

  • 为什么要传递谓词的名称​​ convert / 2
  • 最重要的是我看不到递归电话!!
  • 通过编写[_ | X]来忽略列表的head元素,这意味着列表中包含head元素和尾部X.
  • 您尝试在X上使用转换为列表并将原子转换(X,Y)指定给L.请注意,prolog不是过程语言,转换(X,Y)将仅通过调用转换(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).