Prolog评估列表中的数字

时间:2016-10-23 19:51:15

标签: prolog

我正在开发一个Prolog应用程序,它将遍历一个值列表并将值复制到另一个列表中。如果值是数字,那么我想将该数字平方,否则,复制该值。

所以给出了输入:

 [k, 4, 9, b]

它应该产生:

 [k, 16, 81, b]

这就是我所拥有的:

squareMe(X, P) :- P is X * X.

boogie([],[]).
% The next line is where I'm having problems
boogie([X|T], [X|Result]):-
    number(X),
    boogie(T,Result).
boogie([ThrowAway|Tail], [ThrowAway|Result]):-
    boogie(Tail,Result).

现在,这几乎可行。所以我尝试的第一件事就是:

boogie([X|T], [X*X|Result):-

Prolog不会评估表达式,因为你需要“是”。所以我试过了:

boogie([X|T], [Y is X*X|Result):-

那不起作用。我试过了:

boogie([k, 4, 9, b], T).

我的输出是:

T = [k, _G3648 is 4*4, _G3657 is 9*9, b].

有没有办法可以获得列表中数字的平方? 即。

boogie([X|T], [Square of X|Result]):-

2 个答案:

答案 0 :(得分:1)

怎么样?
boogie([X|T], [Y|Result]):-
    number(X),
    Y is X*X,
    boogie(T,Result).

答案 1 :(得分:0)

我承认我多年来没有做过序幕,但你的方法让我感到困惑。简单地使用一个谓词来处理'会更容易。单个令牌,然后用它递归处理输入列表中的每个令牌? e.g。

%% In file 'boogie.pl'

% 'processToken' predicate
processToken( Unprocessed, Processed )   :- number( Unprocessed ), 
                                            Processed is Unprocessed ^ 2, 
                                            !.
processToken( Unprocessed, Processed )   :- not( number( Unprocessed )),
                                            Processed = Unprocessed.

% 'processList' predicate
processList( [], [] ).   % Base case
processList( InputList, OutputList ) :- [H_in  | T_in  ] = InputList, 
                                        [H_out | T_out ] = OutputList,
                                        processToken( H_in, H_out ),
                                        processList( T_in, T_out ),
                                        !.

然后在你的prolog控制台:

?- consult( 'boogie.pl' ).
% boogie.pl compiled 0.00 sec, 1 clauses
true.

?- processList( [1, 2, a, v, 'hi there', '5', 6], Out ).
Out = [1, 4, a, v, 'hi there', '5', 36].