如何使用序言中的delete1()谓词将元素添加到列表中?

时间:2020-05-31 15:14:21

标签: prolog add

我需要使用我编写的delete1谓词将元素添加到列表中:

delete1(H,[H|T],T).
delete1(H,[D|X],[D|Y]):-delete1(H,X,Y).

我该怎么做?好吧,我知道如何删除元素,但无法弄清楚如何在其中添加元素。我需要显示所有可能的列表,这些列表将是在[x,y,z,a]列表中添加56的结果。你有什么主意吗?

1 个答案:

答案 0 :(得分:0)

如果编程良好,则Prolog谓词可以“向后运行”:

f(X,Y)应该读为X通过Yf相关。

  • 给出一个x,就可以计算出Y(可能通过回溯来计算多个Y):f(x,Y)被解释为 { {1}},例如:Y

  • 给出一个f(x) = Y,就可以计算出y(可能通过回溯来计算多个X):X被解释为 { {1}},例如:f(X,y)

  • 给出一个X,就可以计算真值:f(X) = y解释为 true ,如果(但不是(x,y))。

(有多少个Prolog谓词被“很好地编程”?如果有研究关于在教室外编写的有多少个Prolog谓词可以双向工作,我想知道这一点;我的猜测是最迅速地分解为单向函数,通常不值得添加边缘案例和测试代码来使谓词双向工作的麻烦

如果上述条件最好,那么

  • f(x,y)是双射的,即:“在任一方向上进行计算时都不会丢弃任何信息”
  • 双向计算都很容易(很难进行加密工作)

因此,在这种情况下:

f(x) == y将三个参数f关联如下:

delete(Element,ListWith,ListWithout)(Element,ListWith,ListWithout),没有ListWithout

请注意,从ListWithElement的“向前移动”会破坏信息,即删除的元素的确切位置,或者甚至是第一个元素。坏!不合逻辑!

要使(Element,ListWith)向后运行,我们只需要:

ListWithout

反向删除问题有四种解决方案。

程序错过了一个:

delete1/3

甚至更多:

?- delete1(56,L,[a,b,c]).
L = [56, a, b, c] ;
L = [a, 56, b, c] ;
L = [a, b, 56, c] ;
L = [a, b, c, 56] ;

如您所见,保留信息很重要!