2014-11-24 52 views
1

我想让用户输入他们的生日,所以我可以告诉他们他们的星座。但是,我很难得到他们的实际生日和月份。有人可以帮我吗?我试图将读取分隔成不同的函子,但我不断收到错误。当我将两个读取结合起来时,出现的错误是“语法错误:操作员优先级冲突”。我将两个读取分开时得到的错误是“错误:=:=/2:参数没有充分实例化”。当我分开读取如何获得用户输入序言和存储

start :- 
    read_month, 

read_month :- 
    write('Enter your birth month (month followed by a .): '), 
    nl, 
    read(X), 
    write('Enter your day of birth (followed by a .): '), 
    nl, 
    read(Y), 
    horoscope(X,Y). 

代码:当我结合读取

代码

start :- 
    read_month, 
    read_day. 

read_month :- 
    write('Enter your birth month (month followed by a .): '), 
    nl, 
    read(X). 

read_day :- 
    write('Enter your day of birth (followed by a .): '), 
    nl, 
    read(Y), 
    horoscope(X,Y). 

回答

3

作为一个初学者,不启动这样。 (你的第一个程序在语法上是不正确的;第一个规则不会以句点结束)。

相反,写的关系month_day_sign/3,你可以在顶层直接使用,就像这样:

?- month_day_sign(7,24,Sign). 
Sign = leo. 

那怎么你通常与Prolog的交互方式。所以你正在利用顶层shell的功能。

一旦你掌握了这一点,你可以做一些额外的接口。但不要走另一条路!


通过分离这两个“动作”,在X现在从horoscope(X,Y)断开......

+0

downvoted,因为这不回答这个问题。这个答案会对实际问题做出回答,并提出一个很好的评论或附注。 – Xaser 2017-11-03 05:57:51

+1

@ Xaser,意外地看到了这个问题和你的评论,提供的答案是比op提供的更好的优化方法,所以这怎么回答这个问题(因为它被接受)? – coder 2017-11-03 17:37:41

+0

@coder,答案可能已被接受,因为OP对所提供的解决方案感到满意,尽管它没有做他最初打算做的事情。但是,还有很多其他人在谷歌上遇到这个问题,替代方案是不可行的,他们仍然在寻求一种方法来完成问题的要求(即使用正确的终端查询)。 – Xaser 2017-11-04 02:55:11