使用给定公式的可能列表排列

时间:2016-04-14 22:42:30

标签: list prolog permutation

我正试图让我的头脑环绕Prolog中的列表。要做到这一点,我试图创造一种游戏。您传入可以重复的数字1-9列表,列表可以是任意长度。规则是从第一个元素(e)开始,你只能移动到e + 2或e + 3,直到你结束。目标是“登陆”最高数字。从本质上讲,它有点像跳房子。我遇到的问题是确定路径的所有可能的排列。到目前为止,我有以下内容。

paths([], []). %empty list returns empty list
paths([X], [X]). %list with one element returns that one element
paths([X1, X2], [X1]). %list with 2 elements returns the first element
paths([X1, X2, X3], [X1,X3]). %list with three elements returns the first and third element
paths() :- % the recursive case for a list with 4+ elements

要使用的列表是:[1,2,3,4,5,6,8,7,9,3,6,5,7,8,9] 我需要使用上面提到的规则来确定所有可能的路径。我希望列表可以在Prolog中编入索引:(

任何逻辑指导都将不胜感激。

3 个答案:

答案 0 :(得分:1)

要求并不完全清楚,但似乎:

  • 第二个参数需要与第一个元素相同 第一个参数(你"跳"在第一个" square"第一个,总是,使用 你的跳房子比喻)

  • 您并不要求第一个列表的最后一个元素是 第二个列表的最后一个元素(你不是要求你"降落 上"最后一个" square")。

  • 空列表成功,列表结果为空(而不是仅仅在空列表上失败 - 这是另一种有效的方法)。

然后可以按如下方式实施。您不需要许多明确的2和3元素列表情况,因为它们由递归子句和更简单的基本情况处理。

path([], []).
path([X], [X]).
path([X,_|T], [X|R]) :-   % hop over 1 element
    path(T, R).
path([X,_,_|T], [X|R]) :- % hop over 2 elements
    path(T, R).

举个简单的例子:

| ?- path([1,2,3,4,5,6], R).

R = [1,3,5] ? ;

R = [1,3,6] ? ;

R = [1,4,6] ? ;

R = [1,4]

yes

如果我没有完全正确的要求,您应该能够调整它以满足您的需求,因为它显示了如何处理递归案例。听起来你似乎正朝着试图优化啤酒花价值的方向前进,我也将把它留作练习。

这也可以通过DCG(明确的子句语法)来完成

path([]) --> [].
path([X]) --> [X].
path([X|T]) --> ([X,_] | [X,_,_]), path(T).

将会行使哪些:

| ?- phrase(path(R), [1,2,3,4,5,6]).

R = [1,3,5] ? ;

R = [1,3,6] ? ;

R = [1,4,6] ? ;

R = [1,4] ? ;

(1 ms) no
| ?-

<小时/> 鉴于额外要求所采取的最后一步必须是列表中的一个,这里是path/2谓词的更新版本:

path([], []).
path([X], [X]).
path([X,_], [X]).
path([X,_,Y|T], [X|R]) :-   % hop over 1 element
    path([Y|T], R).
path([X,_,_,Y|T], [X|R]) :- % hop over 2 elements
    path([Y|T], R).

答案 1 :(得分:0)

我认为有理由避免indexing:简单。如果你分解你的问题,也许你可以开始写一个步骤/ 3谓词,如

step([_,X|T],X,T).
step([_,_,X|T],X,T).

然后

paths([],[]).
paths(L,[X|Xs]) :- step(L,X,T), paths(T,Xs).

注意:我不太了解你的游戏,欢迎游乐场和解决方案的一些例子。

答案 2 :(得分:0)

%passing in a list and return all possible paths using K+2 or K+3 with K being the first element of the list.
%empty list returns empty list
%list with one element returns that one element
%list with 2 elements returns the first element
%list with three elements returns the first and third element
%list with four/four+ elements needs to be called recursively, prefix them with the first element and append them together
%RL means ReturnList
%FL means FinalList
%List is the appended list containing all the paths
paths([], []). 
paths([X], [[X]]). 
paths([X1, X2], [[X1]]). 
paths([X1, X2, X3], [[X1,X3]]). 
paths([X1, X2, X3, X4 | T], List) :-
   paths([X3,X4|T], RL), paths([X4|T], RL2), 
   prefix_all(X1, RL, FL1), prefix_all(X1, RL2, FL2), 
   append(FL1, FL2, List). 

因此,如果使用列表[1,2,3,4,5]运行,则会生成以下内容:

| ?- paths([1,2,3,4,5],X). 

X = [[1,3,5],[1,4]] ? ;
no