List Prolog-在其他变量条件下构造列表

List Prolog-在其他变量条件下构造列表,list,prolog,List,Prolog,我是Prolog新手,我正在努力解决这个问题 我想构建一个给定教师为特定结果分配的等级列表。然后,我想计算出现的离散级别数。显然,我下面的append()谓词完全是胡说八道,但它们显示了我的一般方法(以及我对它的工作原理是多么无知)。我已经尝试了很多次迭代,但是我用这个在黑暗中拍摄 谢谢 var program = `:- use_module(library(lists)). teacher_level(mike,a1).

我是Prolog新手,我正在努力解决这个问题

我想构建一个给定教师为特定结果分配的等级列表。然后,我想计算出现的离散级别数。显然,我下面的
append()
谓词完全是胡说八道,但它们显示了我的一般方法(以及我对它的工作原理是多么无知)。我已经尝试了很多次迭代,但是我用这个在黑暗中拍摄

谢谢

     var program = 
        `:- use_module(library(lists)). 
            teacher_level(mike,a1).
            teacher_level(mike,a2).
            teacher_level(mike,b1).

            teacher_level(phil,b1).
            teacher_level(phil,b2).
            teacher_level(phil,c1).

            append([], List2, Result) :-
                Result = List2,
                !.                     
            append(List1, List2, Result) :-
                List1  = [Head1 | Tail1],
                Result = [HeadR | TailR],
                Head1  =  HeadR,
                append(Tail1, List2, TailR).
            append(L,List):-
                append([L],_,List).

            table([[T1,L1],[T2,L2],[T3,L3],[T4,L4]],List):-
                teacher_level(T1,L1),
                teacher_level(T2,L2),
                teacher_level(T3,L3),
                teacher_level(T4,L4),

                append([L],List):-
                    teacher_level(mike,L).
        `

    session.consult( program );
    session.query('table([[T1,L1],[T2,L2],[T3,L3],[T4,L4]],List).')

看起来你在头序言里?如果是这样的话,
append/3
是一个内置的,如果您
:-使用_模块(库(列表))。
谢谢,我已经离开这个问题,遇到了更多。现在我想创建唯一变量,而不是将\=放在所有变量和其他变量之间。荒谬的是,为什么它不是一些基本内置的东西,但我确实找到了这个建议,但当然tau prolog没有dif/2,而且我尝试过的任何变体都不起作用。你知道一个正常的、合乎逻辑的解决方案,可以在一开始就设置,从而最大限度地提高速度吗?我恐怕Tau是一种相对年轻的方言,所以对这样的东西没有太多的支持。充其量,你可以编写自己的所有不同谓词,它接受一个列表,断言头部与尾部不同,并在尾部递归。我在这方面所做的任何尝试最终都比将其断言为一个庞大的\\='列表要慢。如果我能在一开始就设置if,而不是在之后,那会有帮助,但这似乎不起作用,除非我不知道prolog的其他机制。不是在Tau中,你需要
clpfd
。你能把查询服务器端移动一下,用电话打电话吗?SWI Prolog也有
clpfd
。以下是我的模板SWI Prolog pengines和Tau Prolog stack repo: