遍历列表直到找到正确的顺序?

时间:2019-02-25 19:08:35

标签: list sorting prolog

我需要循环浏览Prolog中的列表,直到出现有效序列为止。在这种情况下,序列进入"u" "r" "d" "l"。列表将仅由这些字符组成。我已经有一个方法可以返回所有可能循环的列表,例如:

?- all_cases(["l", "u", "r", "d"], S).
S = [["l", "u", "r", "d"], ["u", "r", "d", "l"], ["r", "d", "l", "u"], ["d", "l", "u", "r"]].

如您所见,第二个列表按我需要的顺序排列。现在的问题是,我需要遍历该列表(S),直到找到所需的列表为止。最终结果应如下所示。 “循环移位”是正确的输出,“什么”包含所有移位。

 all_cases(["u","r","r","d","d","l","l","u"],What),try_all_sqA(What).
 cyclic shift: ["u","u","r","r","d","d","l","l"] is correct
 What = [["u", "r", "r", "d", "d", "l", "l", "u"], ["r", "r", "d", "d", "l", "l", "u"|...], ["r", "d", "d", "l", "l", "u"|...], ["d", "d", "l", "l", "u"|...], ["d", "l", "l", "u"|...], ["l", "l", "u"|...], ["l", "u"|...]["u"|...]].

我已经尝试过sort/4,但这只给我列出了按字母顺序或反向字母顺序排列的列表,我需要根据唯一序列(u,r,d,l)对它进行排序。 / p>

1 个答案:

答案 0 :(得分:2)

好吧,让我们将问题分解为较小的部分。我们将首先构造一个与列表元素匹配的谓词,直到列表用尽,或者直到列表中的元素不再是我们要查找的元素为止,我们可以使用var dominantLanguage: NLLanguage? { get } 谓词来实现:

dominantLanguage

例如:

import NaturalLanguage

let string = "J'ai deux amours. Mon pays et Paris."
let recognizer = NLLanguageRecognizer()
recognizer.processString(string)
let language = recognizer.dominantLanguage
print(language?.rawValue) // Optional("fr")

这意味着我们可以验证一个序列具有零个或多个seq/3,然后是零个或多个seq([], _, []). seq([H|T], H, R) :- seq(T, H, R). seq([H|T], X, [H|T]) :- dif(H, X).,然后是零个或多个?- seq(["u", "r", "d", "l"], "u", R). R = ["r", "d", "l"] ; false. ?- seq(["u", "r", "d", "l"], "r", R). R = ["u", "r", "d", "l"]. ,最后是零个或多个"u",其中:

"r"

例如:

"d"

所以现在我们只需要搜索,直到找到一个轮换列表即可,然后可以打印该列表,例如:

"l"

例如:

sequrdl(LA) :-
    seq(LA, "u", LB),
    seq(LB, "r", LC),
    seq(LC, "d", LD),
    seq(LD, "l", []).
相关问题