显示所请求事实的元素

时间:2015-10-18 23:08:51

标签: prolog

我对Prolog很新,我很难理解我做错了什么。我试图以一个关键字的形式获取用户输入,然后显示它所属的任何类的完整详细信息。 如果我以这种格式course(managing, A, B, C, D, E)查询,我的代码将显示信息,但是当我尝试简化时,我的代码将无效。

有人可以告诉我如何编辑我的代码,以便它会询问我想要的信息,并且在显示与该课程相关的所有信息之前只需要一个单词的答案吗?

course(
    accouting,
    acc10707,
    day(tuesday),
    time(1100, 1250),
    prof(ayesha, mujib),
    b228
).
course(
    managing,
    mng10247,
    day(thursday),
    time(1000, 1150),
    prof(brian, morris),
    b228
).
course(
    communication,
    com00207,
    day(monday),
    time(1000, 1250),
    prof(ali, bec),
    b727
).

details :-
    write('Please enter unit keyword.'),
    nl,
    read(Name),
    course(Name,Code,Day,Time,Prof,Room), 
    write(Name,Code,Day,Time,Prof,Room).

1 个答案:

答案 0 :(得分:2)

使用您提供的代码,我在版本1.4.4中遇到以下错误:

| ?- details.
Please enter unit keyword.
communication.
uncaught exception: error(existence_error(procedure,write/6),details/0)

问题是什么?

  • details/0中的最后一个目标是write(Name,Code,Day,Time,Prof,Room)

  • 您无意中尝试使用不存在的write/6

将(S)?

  1. 使用 代替details/0中的副作用!

    让我们定义details_of/2。它的第一个参数是结构c/6

    details_of(Details,Course_name) :-
        Details = c(Course_name,Code,Day,Time,Prof,Room),
        course(Course_name,Code,Day,Time,Prof,Room). 
    

    样品使用:

    | ?- details_of(X,communication).
    
    X = c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727)
    
    yes
    
  2. 快速修复:而不是write/6使用write/1和结构c/6

    write(Name,Code,Day,Time,Prof,Room)替换为 write(c(Name,Code,Day,Time,Prof,Room))

    | ?- details.
    Please enter unit keyword.
    communication.
    c(communication,com00207,day(monday),time(1000,1250),prof(ali,bec),b727)
    
    yes