在Prolog中编辑Eliza chatbot

时间:2015-10-16 21:29:19

标签: prolog

我一直在努力尝试在Prolog中编辑Eliza聊天机器人。每次我尝试编辑某些内容时,都会显示一个新错误。它受到任何编辑的保护吗?

我使用SWI-prolog编辑器编辑。问题是我试图在不完全理解代码的情况下最小化代码。我试图做一个简单的简短版本。所以,我可能会删除一些必要的东西!喜欢" my_char_type"例如。我得到的错误是" retract / 1:无权修改静态过程`rules / 1'"

我能理解的小聊天机器人是否有任何代码?

请帮助:'(

2 个答案:

答案 0 :(得分:1)

Prolog有一个静态商店和一个动态商店。如果您打开一个文件,请说出program.pl并在其中添加一些代码:

foo(tabitha).
foo(darlene).

这些事实在静态商店中结束。它们不是程序的可变部分(默认情况下)。

asserta/1assertz/1retract/1以及retractall/1程序构成了动态商店的基础。如果您只是坐在控制台上,您可以向动态商店添加一些事实,并通过执行以下操作将其删除:

?- 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/1assertz/1或声明谓词是动态的,像这样:

:- dynamic foo/1.

所以前进有两种方式:

  1. 直接编辑程序源并重新加载。
  2. 如上所述声明rules/1谓词动态。
  3. 顺便提一下,最好通过在提示符下运行make.来重新加载SWI-Prolog。

    我会推荐选项#1,否则当你喜欢它正在做的事情时很难重建你的工作程序的状态。

答案 1 :(得分: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显然缺少像read_line_from_codes这样的IO原语,因此粘贴完整代码更简单)

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).

较旧的代码:ELIZA.ILRWL.IL