【问题标题】:List as variable/argument in Prolog在 Prolog 中作为变量/参数列出
【发布时间】:2015-05-18 16:24:22
【问题描述】:

我在 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,这些列表中的每一个都是列表的不同表示,但我不确定哪种列表表示适合完成对预定义列表的操作。

谢谢!

【问题讨论】:

  • 您不能嵌入谓词调用,例如turn(listv(X), R)。那谓词/事实是什么意思?它有两个未定义的变量。您需要turned_lists(P, Result) :- call(P, L), turn(L, Result). 之类的东西并将其称为turned_lists(alist, Result). 或类似的东西,这完全取决于您要达到的目标(这并不完全清楚)。
  • 糟糕,这些是对我已经进行的现有谓词的查询!很抱歉那里不够清晰。

标签: list variables prolog arguments


【解决方案1】:

谓词turn/2可以很容易地基于append/3定义:

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]。 % 确定性地成功 ?- named_list(a_to_f,Ys), turn(Xs,Ys)。 %“其他”方向 Ys = [a,b,c,d,e,f], Xs = [f,a,b,c,d,e] % 成功留下选择点 ;错误的。

到目前为止,我们在查询中使用了一个特定的样本列表a_to_f;让我们全部使用!

?- named_list(Name,Xs), turn(Xs,Ys)。 名称 = one_to_nine , Xs = [1,2,3,4,5,6,7,8,9], Ys = [2,3,4,5,6,7,8, 9,1] ;名称 = a_to_f , Xs = [a,b,c,d,e,f] , Ys = [b,c,d,e,f,a] ;名称 = single_digit_primes,Xs = [2,3,5,7],Ys = [3,5,7,2]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多