【问题标题】:PROLOG retract its not workingPROLOG 收回它不工作
【发布时间】:2015-11-25 02:51:47
【问题描述】:

我需要从谓词列表中删除一个项目,但它不起作用。它为我返回 true,但该项目仍然存在。

代码:

eliminar :- limpar,
    write('\n*** DELETAR ***\n'),
    write('O que deseja deletar ?\n'),
    pegarString(X),
    doenca(X),
    format('~Doença: ~w ~n Sintoma: ~w ~n',[X]),
    retract(doenca([X,_]));
    write('  ').
pegarString(S) :-
    read_line_to_codes(user_input,C),
    name(S,C).
perguntadd(X) :- limpar,
    write('\n*** ADICIONAR ***\n'),
    write('\nDigite o nome da doença que deseja adicionar\n'),
    pegarString(X).
adicionar(X) :-
    format('Digite o sintoma da doença ~w?~n ',[X]),
    pegarString(I),
    assertz(doenca([X,I])),
    format('~n~w foi adicionado aos registros!~n~n',[X]).

【问题讨论】:

  • 请提供一个minimal reproducible example 来证明您的问题。从您当前提供的代码中无法判断发生了什么。
  • ok reissued 现在可以看到所有变量了。
  • 在我看来,您可能已经静态定义了doenca/1。您应该在文件顶部的某处有一个:- dynamic doenca/1. 行,我非常怀疑您在同一个规则正文中同时拥有doenca(X)retract(doenca([X,I])),这无法成功。还有更多来源吗?

标签: dynamic prolog prolog-assert


【解决方案1】:

第一个子句中的低级问题:

...
format('~Doença: ~w ~n Sintoma: ~w ~n',[X]),
retract(doenca([X,_]));
write('  ').

特别是';'看起来很可疑。我猜你想要的

forall(retract(doenca([X,Sintoma])),
       format('~Doença: ~w ~n Sintoma: ~w ~n',[X,Sintoma])),
write('  ').

另外,我会考虑更好的设计来存储 doenca/2 而不是 doenca/1。

【讨论】:

  • 我几乎感觉 Prolog 代码行尾的分号 ; 应该被编辑器/IDE 突出显示为错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-02
  • 2017-11-04
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多