Prolog如何在列表中添加元素(如果在列表中)

时间:2019-07-10 09:54:59

标签: prolog

我正在尝试使用自己的谓词创建列表成员(member/2)。

开始这个例子

?-app([a,r,t],[t,s,m,n,a],L3). 

L3=[a,t]

我试图做类似的练习,所以我用序言做了这个:

app([],_,[]).
app([H|T],[H1,T1],[H|L1]):- H is H1,  L1 is H,! ,app(T,T1,L1).
app([_H|T],L,L2):-  app(T,L,L2).

和所有正常工作,但列表中的值在执行期间将被覆盖,实际上,跟踪为:

trace, app([3,2],[3,5],X).
   Call: (9) app([3, 2], [3, 5], _7426) ? creep
   Call: (10) 3 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) _7736 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) app([2], 5, 3) ? creep
   Call: (11) app([], 5, 3) ? creep
   Fail: (11) app([], 5, 3) ? creep
   Fail: (10) app([2], 5, 3) ? creep
   Fail: (9) app([3, 2], [3, 5], _7426) ? creep
false.

我试图通过这种方式对基本情况进行修改:

app([],_,_N).

但是输出都是错误的:

trace, app([3,2],[3,5],X).
   Call: (9) app([3, 2], [3, 5], _7426) ? creep
   Call: (10) 3 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) _7736 is 3 ? creep
   Exit: (10) 3 is 3 ? creep
   Call: (10) app([2], 5, 3) ? creep
   Call: (11) app([], 5, 3) ? creep
   Exit: (11) app([], 5, 3) ? creep
   Exit: (10) app([2], 5, 3) ? creep
   Exit: (9) app([3, 2], [3, 5], [3|3]) ? creep
X = [3|3].

我错了吗?

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试创建一个this.$ionic.modalController.create({ component: NewAppointmentModal}).then(m => m.present()) //how can i catch the onSuccess event like before 谓词:

sublist/2

还有更多方法可以做到这一点,但是我认为%! sublist(Sub, List) % is true if Sub is a list that occurs in % some position in List sublist(Sub, List) :- % first partition off some tail of the list append(_Prefix, Tail, List), % then get some prefix of the tail, this is a sublist append(Sub, _TailTail, Tail). 很容易 了解。这是与append/3不同的问题,member/2是在列表中查找元素,这里的问题是将列表分成几块,因此实现方式与member/2完全不同。您通常会在Prolog中发现解决方案的第一步是很好地定义问题。祝您在Prolog学习中好运。