显示请求事实的元素

Display elements of requested fact

我是 Prolog 的新手,我很难理解我做错了什么。我正在尝试以一个关键字的形式获取用户输入,然后显示 class 中任何一个的完整详细信息。 如果我以这种格式查询,我的代码将显示信息 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.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/<b>6</b>,它不存在。

解决方案?

  1. 使用 而不是在 details/0!

    中执行副作用

    让我们定义details_of/<b>2</b>。它的第一个参数是结构 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