我需要使用我编写的delete1谓词将元素添加到列表中:
delete1(H,[H|T],T).
delete1(H,[D|X],[D|Y]):-delete1(H,X,Y).
我该怎么做?好吧,我知道如何删除元素,但无法弄清楚如何在其中添加元素。我需要显示所有可能的列表,这些列表将是在[x,y,z,a]列表中添加56的结果。你有什么主意吗?
答案 0 :(得分:0)
如果编程良好,则Prolog谓词可以“向后运行”:
f(X,Y)
应该读为X
通过Y
与f
相关。
给出一个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
。
请注意,从ListWith
到Element
的“向前移动”会破坏信息,即删除的元素的确切位置,或者甚至是第一个元素。坏!不合逻辑!
要使(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] ;
等
如您所见,保留信息很重要!