List 为什么内置的delete谓词不能处理这个动态列表?(序言)

List 为什么内置的delete谓词不能处理这个动态列表?(序言),list,dynamic,prolog,List,Dynamic,Prolog,我有一个动态列表: :- dynamic queue/1. queue([Bob,Steve,Richard,Katie]). 和一个谓词: delete_person(Person) :- queue(Q), retractall(queue(_)), delete(Q, Person, Z), assert(queue(Z)). 从逻辑上讲,我就是这样想的,但我显然犯了一个错误,因为在运行谓词delete\u person后,列表保持不变。这个代码段中存在多个问

我有一个动态列表:

:- dynamic queue/1.

queue([Bob,Steve,Richard,Katie]).
和一个谓词:

delete_person(Person) :-
   queue(Q),
   retractall(queue(_)),
   delete(Q, Person, Z),
   assert(queue(Z)).

从逻辑上讲,我就是这样想的,但我显然犯了一个错误,因为在运行谓词
delete\u person

后,列表保持不变。这个代码段中存在多个问题。首先,您发布了以下程序:

:- dynamic queue/1. queue([Bob,Steve,Richard,Katie]). delete_person(Person) :- queue(Q), delete(Q, Person, Z). assert(queue(Z)). 然后我们仍然有以下单例警告

Singleton variables: [Bob,Steve,Richard,Katie] 然后,至少程序编译时没有警告

现在我们可以谈谈实际问题:

?- delete_person(bob). true. ?- queue(Q). Q = [bob, steve, richard, katie] ; Q = [steve, richard, katie]. 优点:

  • 可在多个方向使用
  • 可以独立于其他谓词进行测试
  • 是自动线程安全的
  • 几乎可以肯定比修改全局数据库更有效
  • 等等

  • 此代码段中存在多个问题。首先,您发布了以下程序:

    :- dynamic queue/1. queue([Bob,Steve,Richard,Katie]). delete_person(Person) :- queue(Q), delete(Q, Person, Z). assert(queue(Z)). 然后我们仍然有以下单例警告

    Singleton variables: [Bob,Steve,Richard,Katie] 然后,至少程序编译时没有警告

    现在我们可以谈谈实际问题:

    ?- delete_person(bob). true. ?- queue(Q). Q = [bob, steve, richard, katie] ; Q = [steve, richard, katie]. 优点:

  • 可在多个方向使用
  • 可以独立于其他谓词进行测试
  • 是自动线程安全的
  • 几乎可以肯定比修改全局数据库更有效
  • 等等