代码之家  ›  专栏  ›  技术社区  ›  aioobe

序言常量

  •  10
  • aioobe  · 技术社区  · 15 年前

    我想写一些

    list1 :- [1, 2, 3].
    list2 :- [4, 5, 6].
    
    predicate(L) :- append(list1, list2, L).
    

    我现在用的是

    list1([1, 2, 3]).
    list2([4, 5, 6]).
    
    predicate(L) :-
        list1(L1),
        list2(L2),
        append(L1, L2, L).
    

    但每次需要访问常量时,像这样绑定一个“无用”的变量有点笨拙。

    (在我的实际应用程序中,列表是一个在许多地方使用的大型LUT。)

    2 回复  |  直到 15 年前
        1
  •  13
  •   Mau    11 年前

    原因是:

    1) 你不能写东西

    list1 :- [4, 5, 6].
    

    list1 = [4, 5, 6].
    

    2) 你不能写东西 喜欢

    List1 :- [4, 5, 6].
    

    List1 = [4, 5, 6].
    

    因为左侧现在是一个变量,但变量只允许在谓词头/体中使用。

    能够 要做的是定义一个多选项谓词,如:

    myList([1, 2, 3]).
    myList([4, 5, 6]).
    

    然后使用bagof(或类似谓词)检索其所有值:

    predicate(L) :-
        bagof(ML, myList(ML), MLs),        
        concat(MLs, L).
    

    MLs ML 满足以下条件的值 myList(ML) concat 连接列表列表。

        2
  •  4
  •   starblue    15 年前

    或者更好,将查找函数封装在谓词中。

    term_expansion/2 ,但如果不小心,它会使代码变得不可读和混乱。

    Mercury ). 但这些比序言更具异国情调。

    推荐文章