在这个程序之前,我在下面的例子中看到过元素 X 是否属于字符串 L。
这个例子的代码如下:
member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).
我有一个表示基本情况的事实(如果 X 元素在列表的头部,则它属于列表),并且如果元素 X 不是头部,则使用该规则在列表的尾部递归搜索。 ..
这个版本对我来说非常晦涩难懂,有人建议我以这种方式查看它以了解它是如何工作的:
member2(X, [X|_]).
member2(X,Y):- Y = [_|T],
member2(X,T).
所以意思就更清楚了:
我有一个代表基本情况的事实(如果 X 元素位于列表的头部,则它属于列表)。
规则说我必须证明两件事:
1) Y = [_|T] 这是真的,因为匿名变量 _ 与任何东西统一
2)递归搜索尾列表中的元素X
好的,现在我在理解这个新练习时遇到了问题,我必须编写一个 SWI Prolog 程序,给定两个字符串,将第二个字符串连接到第三个字符串中的第一个字符串
解决方案是:
myappend([], L, L).
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
我有一些问题要理解它是如何工作的
我知道事实代表基本情况:当第一个参数是 void 列表 [] 而第二个参数是非 void 列表时,第一个参数和第二个参数的连接是第二个参数列表(这等于第三个参数)
该规则表示第一个参数不是空列表的一般情况......所以我认为当这种情况发生时,它会删除 L1 参数的头部(第一个列表的头部),直到这是一个空列表 [] ,所以我将有基本情况,第三个参数统一到第二个......然后做回溯......
但是我很难理解该规则是如何运作的:
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
我正在尝试做类似前面示例的操作,并将其翻译成更通俗易懂的逻辑形式,因为这种方式对我来说非常不清楚……但我不知道该怎么做……我该怎么做
这个规则背后的逻辑是什么?这是什么意思?