Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog中的前缀_List_Prolog_Prefix_Dcg - Fatal编程技术网

List Prolog中的前缀

List Prolog中的前缀,list,prolog,prefix,dcg,List,Prolog,Prefix,Dcg,我对Prolog是新手。 我有一个关于谓词前缀的问题,但有点不同 我想得到一个列表的前缀,但是直到一个元素 列表可以有重复的元素 例如: prefix(Element, List, Prefix) prefix(c, [a,b,c,d,e,f], [a, b]) 不包括该元素 到目前为止,我得到的是这个 prefix(X, [X|T], []). prefix(X, [Y|T], [Y|Z]):- prefix(X, T, Z). 但它不起作用 L = [a,b,c] ? prefi

我对Prolog是新手。 我有一个关于谓词前缀的问题,但有点不同

我想得到一个列表的前缀,但是直到一个元素 列表可以有重复的元素

例如:

prefix(Element, List, Prefix)
prefix(c, [a,b,c,d,e,f], [a, b])
不包括该元素

到目前为止,我得到的是这个

prefix(X, [X|T], []).
prefix(X, [Y|T], [Y|Z]):-
    prefix(X, T, Z).
但它不起作用

L = [a,b,c] ? prefix(b, L, Prefix).

no
?- 

谢谢

这里有一个使用确定子句语法和非终结符的解决方案:

因此语法(在
短语/2
中)如下所示:

有 1.初始序列
Ys
,所有元素都不同于
X
,后跟2<代码>X,后跟3。什么都行

还有一个缺点,这在使用DCG时是经常出现的:实现并不像可能的那样确定,因此留下了多余的选择点

prefix(X,[X|T],[]).
prefix(X,[Y|T],Z) :- prefix(X,T,M)  , Z = [Y|M].
输出:

?-L=[a,b,c,d,e,f],前缀(d,L,G)
L=[a,b,c,d,e,f],
G=[a, b、 c]

?-L=[a,b,c,d,e,f],前缀(e,L,G)。
L=[a,b,c,d,e,f],
G=[a, b、 c,d]

编辑#1
原始代码正在工作,请使用(,)而不是(?),如下所示

prefix(X,[X|T],[]).
prefix(X,[Y|T],[Y|Z]) :- prefix(X,T,Z).
输出:

-前缀(d[a,b,c,d,e],G)。
G=[a,b,c]
?-L=[a,b,c],前缀(b,L,前缀)。
L=[a,b,c],
前缀=[a]。

编辑#2 正如用户在评论中提到的,我可以确认您是对的,但在我的解决方案中,我假设列表包含唯一的元素:
前缀(d[d,d],[d])
成功-它应该失败,

与您可以明确声明,对于
元素之前的任何成员
X
X\==Element

prefix(Element, [Element|_], []).
prefix(Element, [Head|List], [Head|Prefix]) :-
    dif(Element, Head),
    prefix(Element, List, Prefix).
或者同样,因为我想在回答的第一次迭代中使用:

prefix(Element, List, Prefix) :-
    append(Prefix, [Element|_Suffix], List),
    maplist(dif(Element), Prefix).
对于后缀,它基本上是相同的:

suffix(Element, List, Suffix) :-
    append(_Prefix, [Element|Suffix], List),
    maplist(dif(Element), Suffix).
如果您不想使用:


“:-”之前缺少右括号。请解释此操作无效。上一段代码中的问号是什么?它应该是一个分号。@Danick:我更新了我的答案。
前缀(d,[d,d],[d])
成功-应该失败。希望在我修改答案后有人投票。它看起来仍然不正确,你不能添加你自己的假设。是的,false是正确的。很抱歉没有提到列表中可以有重复元素。它应该给出第一个答案。@Danick:你说的是“直到一个元素”。我看不出你原来的问题有任何含糊不清的地方。你的解决方案似乎太复杂了,不符合操作目的和技能水平。@migfilg:你可以自由地给出一个不太复杂的答案。我们不能使用复杂的solutions@danick:是的,我希望如此@false:@danick的解决方案对我来说几乎没有问题,我会在第一个子句中使用一个切口,以避免在
前缀(a[a,b,a,c],L)
中出现第二个错误的解决方案。我不认为我应该把这篇文章作为回答。@migfilg:cut???我看不出这里有什么明确的用途(除非你花了很多额外的精力)还有一个问题,如果我想做同样的事情,但从最后一个问题开始,比如后缀,它是怎样的?@Danick,如果你使用
append/2
变体,它基本上是一样的。我把它添加到了我的答案中。没有地图列表,有什么方法可以实现它吗?因为我们不能使用图书馆
suffix(Element, List, Suffix) :-
    append(_Prefix, [Element|Suffix], List),
    maplist(dif(Element), Suffix).
all_dif(_, []).
all_dif(X, [H|T]) :- dif(X, H), all_dif(X, T).