【问题标题】:Prolog add certain items to listProlog 将某些项目添加到列表中
【发布时间】:2019-09-28 15:04:11
【问题描述】:

尽管查看了类似问题的答案,但我无法弄清楚为什么我的代码无法正常工作。我对 Prolog 还太陌生,无法正确命名,但我希望你能看到我想要表达的意思。

我正在根据这个程序大致定义一个时间表,并且正在努力获取 Mike 针对给定结果教授的课程列表(下一步将声明只返回 Mike 和 Phil 教授 2 的结果,但我想解决它,以便我可以看到并理解正在发生的事情)。

我想这应该很简单,但 addToList(List,C) 谓词的任何组合都不起作用。我知道有附加谓词,但我听说它效率低下,并且想学习“原始”方式。我不知道我尝试了多少变化,也无法理解 Prolog 在这方面的工作方式,也不知道我在哪个级别上出错了——这有点像黑匣子之谜使用它。

        var program = 
        :- use_module(library(lists)). 
            prefers(may,a). 
            prefers(may,b). 
            prefers(may,c). 
            prefers(may,d). 

            prefers(bob,a). 
            prefers(bob,b).
            prefers(bob,c).

            prefers(pete,a). 
            prefers(pete,b).
            prefers(pete,c).
            prefers(pete,d).

            prefers(tom,a). 
            prefers(tom,b).
            prefers(tom,c).
            prefers(tom,d).

            teacher_pref(mike,a).
            teacher_pref(mike,b).
            teacher_pref(mike,c).

            teacher_pref(phil,b).
            teacher_pref(phil,c).
            teacher_pref(phil,d).

            addToList([C|List],C):- addToList(List,C).

            timetable([a,[C1,S1,T1],b,[C2,S2,T2],c,[C3,S3,T3],d,[C4,S4,T4]],List1):-

                teacher_pref(T1,C1),
                teacher_pref(T2,C2),
                teacher_pref(T3,C3),
                teacher_pref(T4,C4),

                prefers(S1,C1),
                prefers(S2,C2),
                S1\\=S2,
                prefers(S3,C3),
                S1\\=S3,
                S2\\=S3,
                prefers(S4,C4), 
                S1\\=S4,
                S2\\=S4,
                S3\\=S4,

                addToList(List1,C):-
                    teacher_pref(mike,C).

    session.consult( program );
    session.query('timetable([C1,[a,S1,T1],C2,[b,S2,T2],C3,[c,S3,T3,L3],C4,[d,S4,T4]],List1).')

【问题讨论】:

    标签: list prolog accumulator


    【解决方案1】:

    如果我理解正确,您有:

    teacher_pref(mike,a).
    teacher_pref(mike,b).
    teacher_pref(mike,c).
    

    而你想得到这些类的列表,那就是:

    [a, b, c]
    

    在 Prolog 中,我们有一些高阶谓词用于以下情况:

    %        (What to find, the goal to call, all the results)
    ?- findall(Class, teacher_pref(mike, Class), Classes).
    Classes = [a, b, c].
    

    Tau-Prolog docs 中,它们位于所有解决方案 下,在SWI-Prolog there's a couple more 中。

    把它变成一个更通用的谓词:

    teacher_prefs(Teacher, Prefs) :-
        findall(Pref, teacher_pref(Teacher, Pref), Prefs).
    

    【讨论】:

    • Aja Hammerly 有一个conference talk on YouTube,她在那里完成了类似的任务:结对编程,你可能会觉得很有趣!
    • 谢谢,最后我确实使用了您对findall 的建议,传递了整个谓词。但是现在,最快的最终创建了[T1,L1],[T2,L2],... 的列表,其中[T1,L1]\=[T2,L2]...,并计算T 是给定名称的位置。计数确实是我所追求的。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多