我正在开发一个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]):-
答案 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].