我已经在Prolog中创建了一个功能,以便转向"列表,例如将列表的头部添加到尾部就像这样:
?- turn([a,b,c,d,e], Tlist).
Tlist=[b,c,d,e,a]
在我的计划环境中,我希望能够为规则使用预定义列表,例如
alist([a,b,c,d,e,f])
但是我遇到了很多不同的错误。我已尝试以下作为参数:
turn(alist(L),R).
listv(X) :- alist(L), member(X, L).
turn(listv(X),R).
我理解这些是根据Prolog的列表的不同表示,但是我不确定哪个列表表示适合于在预定义列表上完成操作。
谢谢!
答案 0 :(得分:2)
可以根据append/3
轻松定义谓词turn/2
:
turn([A|As],Bs) :-
append(As,[A],Bs).
为了指定一些样本列表,我们定义了一个辅助谓词named_list/2
:
named_list(one_to_nine , [1,2,3,4,5,6,7,8,9]).
named_list(a_to_f , [a,b,c,d,e,f]).
named_list(single_digit_primes, [2,3,5,7]).
让我们查询!
?- named_list(a_to_f,Xs), turn(Xs,Ys). Xs = [a,b,c,d,e,f], Ys = [b,c,d,e,f,a]. % succeeds deterministically ?- named_list(a_to_f,Ys), turn(Xs,Ys). % "other" direction Ys = [a,b,c,d,e,f], Xs = [f,a,b,c,d,e] % succeeds leaving behind choicepoint ; false.
到目前为止,我们在查询中使用了一个特定的样本列表a_to_f
;让我们全部使用!
?- named_list(Name,Xs), turn(Xs,Ys). Name = one_to_nine , Xs = [1,2,3,4,5,6,7,8,9], Ys = [2,3,4,5,6,7,8,9,1] ; Name = a_to_f , Xs = [a,b,c,d,e,f] , Ys = [b,c,d,e,f,a] ; Name = single_digit_primes, Xs = [2,3,5,7] , Ys = [3,5,7,2].