我有一个使用prolog的家庭作业,我正在将一组1和0翻译成一组不同的字符。例如,这是我的事实
analog([1], .).
analog([1, 1, 1], -).
analog([0], "").
analog([0, 0, 0], ^).
analog([0, 0, 0, 0, 0, 0, 0], #).
示例输入将是
之类的列表 [1,1,1,0,1,1,1,
0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,
0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,
1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1,
0,1,1,1]
我有以下代码:
signal_morse([], []). %base case
signal_morse([A, B, C | Rest, R) :-
analog([A, B, C], H),
signal_morse(Rest, T),
append([H], T, R).
它目前只检查列表中的前三个元素,如果前三个元素与任何事实不匹配,我希望能够检查1个元素。
例如,假设我有[1,0,0],因为这与我的任何规则都不匹配,我希望程序检查[1]并继续查看列表的其余部分。
所以我想知道是否存在任何类型的模式匹配我可以这样做,如果代码analog([A, B, C], H)
找不到匹配项,那么代码将尝试匹配第一个字符,如{{1} }。
答案 0 :(得分:3)
我意识到这对你的家庭作业可能没什么帮助,但这对DCG来说是一个非常完美的问题,我可以帮助你,但它会告诉你它会是什么样子。
analog(.) --> [1].
analog(-) --> [1,1,1].
analog("") --> [0].
analog(^) --> [0,0,0].
analog(#) --> [0,0,0,0,0,0,0].
analogs([]) --> [].
analogs([A|As]) --> analog(A), analogs(As).
用法:
?- phrase(analogs(X), [1,1,1,0,1,1,1, 0,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1, 0,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, 1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,1,1,1, 0,1,1,1]).
X = ['.', '.', '.', "", '.', '.', '.', "", ""|...] ;
无论如何,为了回答你的实际问题,Prolog可以通过这样的方式找出自己的长度:
signal_morse([], []).
signal_morse(Signals, [Code|RemainingMorseCodes]) :-
append(Signal, RemainingSignals, Signals),
analog(Signal, Code),
signal_morse(RemainingSignals, RemainingMorseCodes).