我一直在努力试图在Prolog的编辑艾丽莎聊天机器人。每次我尝试编辑某些内容时,都会显示一个新错误。它受到任何形式的编辑保护吗?编辑艾丽莎聊天机器人在序言
我编辑使用SWI-Prolog的编辑器。问题是,我试图尽量减少代码,但没有完全理解它。我正在尝试做一个简单的短版本。所以,我可能会删除一些必要的东西!比如“my_char_type”。我得到的错误是“缩回/ 1:无权修改静态方法`规则/ 1' ”
是否有一个较小的聊天机器人,我可以理解任何代码?
请帮忙:'(
我一直在努力试图在Prolog的编辑艾丽莎聊天机器人。每次我尝试编辑某些内容时,都会显示一个新错误。它受到任何形式的编辑保护吗?编辑艾丽莎聊天机器人在序言
我编辑使用SWI-Prolog的编辑器。问题是,我试图尽量减少代码,但没有完全理解它。我正在尝试做一个简单的短版本。所以,我可能会删除一些必要的东西!比如“my_char_type”。我得到的错误是“缩回/ 1:无权修改静态方法`规则/ 1' ”
是否有一个较小的聊天机器人,我可以理解任何代码?
请帮忙:'(
Prolog有一个静态存储和动态的商店如果你打开一个文件,说program.pl
,你把一些线这样的:。
foo(tabitha).
foo(darlene).
那些事实静态商店清盘,他们是不是你的程序(默认)的可变部分。
的asserta/1
,assertz/1
和retract/1
和retractall/1
程序形式为T的基础他动态的商店。如果你只是坐在控制台只需要添加一些事实的动态存储,并通过做这样的删除:
?- asserta(baz(tabitha)).
true.
?- baz(X).
X = tabitha.
?- retract(baz(tabitha)).
true.
?- baz(X).
false.
但是,如果要加载program.pl
后坐在提示,并尝试收回foo(tabitha)
你要获取静态程序消息:
?- retract(foo(tabitha)).
ERROR: retract/1: No permission to modify static procedure `foo/1'
ERROR: Defined at /Users/fusion/program.pl:1
的原因是因为foo/1
事实放在静态存储区,而不是动态存储,因为你没有把他们那里asserta/1
或assertz/1
或声明predica TE动态,像这样:
:- dynamic foo/1.
因此,有两种方式前进:
rules/1
谓词动态如上。顺便提一句,在SWI-Prolog中重新加载最好通过在提示符下运行make.
来完成。
我会建议选项#1,因为否则将很难重建你的工作程序的状态,当你喜欢它在做什么。
SWISH有simplest Eliza有史以来,我有以下旧代码,用于测试我的Prolog interpreter。
这里是一个例子会话
1 ?- eliza.
? i am hungry
how long have you been hungry ?
? very long
please go on
? bye
Goodbye. I hope I have helped you
true.
SWI-Prolog的测试版本,从下面ELIZA移植。IL(唉,SWISH显然缺少IO原始像read_line_from_codes,所以它是简单的贴全代码)
eliza :-
write('? '), read_word_list(Input), eliza(Input), !.
eliza([bye]) :-
write('Goodbye. I hope I have helped you'), nl.
eliza(Input) :-
pattern(Stimulus, Response),
match(Stimulus, Dictionary, Input),
match(Response, Dictionary, Output),
reply(Output),
!, eliza.
match([N|Pattern], Dictionary, Target) :-
integer(N), lookup(N, Dictionary, LeftTarget),
append(LeftTarget, RightTarget, Target),
match(Pattern, Dictionary, RightTarget).
match([Word | Pattern], Dictionary, [Word | Target]) :-
atom(Word), match(Pattern, Dictionary, Target).
match([], _Dictionary, []).
pattern([i,am,1],[how,long,have,you,been,1,'?']).
pattern([1,you,2,me],[what,makes,you,think,i,2,you,'?']).
pattern([i,like,1],[does,anyone,else,in,your,family,like,1,'?']).
pattern([i,feel,1],[do,you,often,feel,that,way,'?']).
pattern([1,X,2],[can,you,tell,me,more,about,your,X,'?']) :- important(X).
pattern([1],[please,go,on]).
important(father).
important(mother).
important(son).
important(sister).
important(brother).
important(daughter).
reply([Head | Tail]) :-
write(Head), write(' '), reply(Tail).
reply([]) :- nl.
lookup(Key, [(Key, Value) | _Dict], Value).
lookup(Key, [(Key1, _Val1) | Dictionary], Value) :-
Key \= Key1, lookup(Key, Dictionary, Value).
read_word_list(Ws) :-
read_line_to_codes(user_input, Cs),
atom_codes(A, Cs),
tokenize_atom(A, Ws).
先生,首先我想说,感谢你的一个更老的评论,帮助我找到原来的伊丽莎聊天机器人的代码!现在,我在Prolog中并不擅长,我只有一个任务。我在SWISH和SWI-prolog中都试过了你的代码,但它不起作用。我写了“再见”这个词,但它没有回应:(你能告诉我你在使用什么版本的SWI吗?还有什么是正确的方式来添加更多的规则在这个cahtbot没有犯错误。时间先生 –
我在SWI-Prolog最新版本中测试过它,但我确信它可以在任何版本中工作。在SWISH中 - 正如我所说 - 似乎没有输入工具...您应该保存代码在一个名为(只说)eliza.pl的文件中,然后在SWI-Prolog提示符下:'? - [eliza],eliza.'进行调试,在开始之前输入'? - leash(-all),trace.'如果你还不知道代码是如何工作的,那么向chatbot添加规则可能会很棘手 – CapelliC
好的,谢谢,它工作正常。但是,写命令的正确方式是什么?我的意思是写“再见“没有任何格式化风格没有奏效,这会不会像原来的Eliza?非常感谢! –
请帮助我们理解您的问题提供更多的怎么样信息你是否编辑过它,它抛出了什么错误。 – Logain
感谢您的回复!我编辑了这篇文章。我希望你能帮助:) –