在Prolog中列为变量/参数

时间:2015-03-16 14:05:04

标签: list variables prolog arguments

我已经在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的列表的不同表示,但是我不确定哪个列表表示适合于在预定义列表上完成操作。

谢谢!

1 个答案:

答案 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].