【发布时间】:2012-12-20 14:31:35
【问题描述】:
在这个程序之前,我在下面的例子中看到了一个元素 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).
我有一些问题要理解它是如何工作的
我知道事实代表基本情况:当第一个参数是一个空列表[]并且第二个参数是一个非空列表时,第一个参数和第二个参数的连接是第二个参数列表(和这等于第三个参数)
该规则表示第一个参数不是空列表的一般情况......所以我认为当这种情况发生时它会删除 L1 参数的头部(第一个列表的头部)直到这是一个空list [],所以我会有基本情况,第三个参数统一到第二个......然后做回溯......
但我很难理解该规则是如何运作的:
myappend([X|L1], L2, [X|L]) :- myappend(L1,L2,L).
我正在尝试做类似上一个示例的操作,并将其翻译成更具逻辑性的形式,因为这种方式对我来说非常不清楚......但我不知道该怎么做......我该怎么做
这条规则背后的逻辑是什么?什么意思?
【问题讨论】:
标签: prolog declarative