我需要循环浏览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>
答案 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", []).